当前位置: 首页 > news >正文

哈尔滨网站设计/百度做广告费用

哈尔滨网站设计,百度做广告费用,购物网站建设行业现状,公众号平台建设网站5、短信验证码 1、注册容联云账号,登录并查看开发文档(以下分析来自接口文档) 2、开发文档【准备1】:请求URL地址1.示例:https://app.cloopen.com:8883/2013-12-26/Accounts/{}/SMS/TemplateSMS?sig{}ACCOUNT SID# s…

5、短信验证码

1、注册容联云账号,登录并查看开发文档(以下分析来自接口文档)
2、开发文档【准备1】:请求URL地址1.示例:https://app.cloopen.com:8883/2013-12-26/Accounts/{}/SMS/TemplateSMS?sig={}ACCOUNT SID# sig:使用MD5加密(账户Id + 账户授权令牌 + 时间戳)【准备2】:请求头headersAccept:application/xml;Content-Type:application/xml;charset=utf-8;Content-Length:256; Authorization: # 使用Base64编码(账户Id + 冒号 + 时间戳【准备3】:请求体datato :短信接收端手机号码集合appId :应用Id,官网控制台应用列表获取templateId :模板Id,测试模板id1。datas :补充模板短信中的内容[验证码 | 几分钟输入]经过对接口文档分析,最终需要准备:1.POST请求的地址:url2.POST请求的请求头:headers3.POST请求的请求体:datahttps://app.cloopen.com:8883/2013-12-26/Accounts/{}/SMS/TemplateSMS?sig={}

容联云

ACCOUNT SID:2c94812dgad3018872722dec086d
(主账户ID)
AUTH TOKEN:
222*******e929查看
(账户授权令牌)
Rest URL(生产):https://app.cloopen.com:8883
AppID(默认):2c948zdfe334gg8872722f1b0874未上线
(APP TOKEN 请到应用管理中获取)
鉴权IP:   #关闭,未认证情况下开启,无法发短信

设计添加接口路由

#user/urls.py# 短信验证:v1/users/sms/codepath('sms/code', views.sms_view),

设计短信发送工具

#utils/sms.py
"""对接容联云短信平台,实现发送短信验证码
"""
import random
import time
import base64
import requests
from hashlib import md5class YunTongXunAPI:def __init__(self, accountSid, authToken, appId, templateId):"""差异化的内容做成应用:param accountSid: 账号id,控制台:param authToken: 授权令牌,控制台:param appId: 控制台:param templateId: 短信模板,测试为1"""self.accountSid = accountSidself.authToken = authTokenself.appId = appIdself.templateId = templateIddef get_url(self):"""生成url地址"""post_url = "https://app.cloopen.com:8883/2013-12-26/Accounts/{}/SMS/TemplateSMS?sig={}".format(self.accountSid, self.get_sig())return post_urldef get_headers(self):"""获取请求头"""# 使用Base64编码(账户Id+冒号+时间戳)s = self.accountSid + ':' + time.strftime("%Y%m%d%H%M%S")auth = base64.b64encode(s.encode()).decode()headers = {"Accept": "application/json;","Content-Type": "application/json;charset=utf-8;",# "Content-Length": "256;",   #request模块会自动添加"Authorization": auth}return headersdef get_body(self, phone, code):"""请求体"""data = {"to": phone,"appId": self.appId,"templateId": self.templateId,"datas": [code, '3']}return datadef run(self, phone, code):"""程序入口函数"""url = self.get_url()headers = self.get_headers()body = self.get_body(phone, code)# html: {"statusCode":"000000"}html = requests.post(url=url, headers=headers, json=body).json()#print(html)#未添加测试账号   {'statusCode': '111188', 'statusMsg': '【账号】主账户绑定的测试号码个数为零'}#添加测试账号{'statusCode': '000000', 'templateSMS': {'smsMessageSid': 'fa9de45f66ca4f5ca76833b9005b10e4', 'dateCreated': '20230602224219'}}return htmldef get_sig(self):"""功能函数:生成sig使用MD5加密(账户Id+账户授权令牌+时间戳)"""s = self.accountSid + self.authToken + time.strftime("%Y%m%d%H%M%S")m = md5()m.update(s.encode())return m.hexdigest().upper()if __name__ == '__main__':config = {"accountSid": "2c94812dgad3018872722dec086d","authToken": "22205d59b81465abbd26cf16e929","appId": "2c948zdfe334gg8872722f1b0874","templateId": "1"}ytx = YunTongXunAPI(**config)code = random.randint(1000, 9999)ytx.run("17723452345", code)#运行查看是否有短信收到

设计功能路由调用

#浏览器点击获取验证码,查看xhrheaders里:请求地址  http://127.0.0.1:8000/v1/users/sms/codepayload里:{"phone":""}: 
#user/urls.py# 短信验证:v1/users/sms/codepath('sms/code', views.sms_view),
#dashopt/settings.py
...
#############短信验证配置开始############
MSG_CONFIG = {"accountSid": "2c94811c88518872722dec086d","authToken": "2220db32a697754048bb97e929","appId": "2c94811c8853872722f1b0874","templateId": "1"}

设计发送功能

#user/views.py
...
from utils.sms import YunTongXunAPIdef sms_view(request):"""对接容联云实现短信验证码发送1.获取请求体数据2.生成短信验证码3.调用容联云接口发送短信"""data = json.loads(request.body)phone = data.get("phone")code = random.randint(1000, 9999)smsapi = YunTongXunAPI(**settings.MSG_CONFIG)smsapi.run(phone,code)return JsonResponse({"code": 200, "data": "发送成功"})#http://localhost:7000/dadashop/templates/register_sms.html   发送验证是否成功

调整下

#user/views.py
...
from utils.sms import YunTongXunAPIdef sms_view(request):"""对接容联云实现短信验证码发送1.获取请求体数据2.生成短信验证码3.调用容联云接口发送短信"""data = json.loads(request.body)phone = data.get("phone")code = random.randint(1000, 9999)sms_html = send_msg(phone,code)if sms_html.get("statusCode") == "000000":return JsonResponse({"code": 200, "data": "发送成功"})return JsonResponse({"code": 10110, "error": {"message": "发送失败"}})def send_msg(phone,code):smsapi = YunTongXunAPI(**settings.MSG_CONFIG)sms_html = smsapi.run(phone,code)return sms_html

发送并带有验证的功能

设计redis缓存
#dashopt/settings.py
...
CACHES = {# 缓存邮件激活随机数"default": {
...},"msg_code": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://192.168.1.11:6379/2",# "TIMEOUT": None,  默认300s"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","PASSWORD": "123456"}},
}
放入redis
#user/views.py
...
MSG_CACHE = caches["msg_code"]
...
def sms_view(request):"""对接容联云实现短信验证码发送1.获取请求体数据2.生成短信验证码3.调用容联云接口发送短信"""data = json.loads(request.body)phone = data.get("phone")code = random.randint(1000, 9999)# 1.redis中确认: sms_13603263409key = "sms_%s" % phoneredis_code = MSG_CACHE.get(key)if redis_code:# 3分钟之内已经发过return JsonResponse({"code": 10111, "error": {"message":"code already existed"}})# 3分钟之内没有发过:sms_html = send_msg(phone,code)# 2.存入redisif sms_html.get("statusCode") == "000000":MSG_CACHE.set(key, code, 180)return JsonResponse({"code": 200, "data": "发送成功"})return JsonResponse({"code": 10110, "error": {"message": "发送失败"}})
短时间发送两次短信,注意第二次发送是否成功,以及redis里的数据
      $.ajax({type: "post",url: baseUrl+"/v1/users",datatype: "json",contentType:"application/json",data: JSON.stringify({"uname": $('#uname').val(),"password": $('#upwd').val(),"phone": $('#phone').val(),"email": $('#email').val(),"verify": $('#verify').val(),"carts":localStorage.getItem('cart'),}),success: function (data) { //成功的回调函数if (data.code === 200){//window.localStorage.setItem('dashop_token', data.data.token);//window.localStorage.setItem('dashop_user', data.username);//window.localStorage.setItem('dashop_count', data.data.length);window.localStorage.setItem('dashop_token', data.data.token);window.localStorage.setItem('dashop_user', data.username);window.localStorage.setItem('dashop_count', data.carts_count);alert('注册成功!');window.location.href = '/dadashop/templates/index.html';}else {alert(data.error.message); //返回后端message,弹窗code already existed}},
celery异步发送

...
from django.conf import settings
from utils.sms import YunTongXunAPI@app.task
def async_send_msg(phone, code):   #user/views.py send_msg不用了"""功能函数:发送短信验证码"""smsapi = YunTongXunAPI(**settings.MSG_CONFIG)sms_html = smsapi.run(phone, code)return sms_html
#user/views.py
from .tasks import async_send_active_email, async_send_msg
...# 3分钟之内没有发过:celery异步# sms_html = send_msg(phone,code)async_send_msg.delay(phone, code)# 2.存入redisMSG_CACHE.set(key, code, 180)return JsonResponse({"code": 200, "data": "发送成功"})

重启celery

#发送短信,查看celery日志,查看redis存储结果...: INFO/MainProcess] Task user.tasks.async_send_msg[36ca7635-b751-4948-b257-c5d422624d82] succeeded in 0.5160000000032596s: 

设计验证

抓包请求

#注册 查看xhr请求
Request URL: http://127.0.0.1:8000/v1/usersPayload:  {uname: "", password: "", phone: "17723452345", email: "", verify: "11111", carts: null}
#user/views.py
...
def users(request):"""注册模块视图逻辑"""# 1.获取请求体数据data = json.loads(request.body)uname = data.get('uname')password = data.get('password')phone = data.get('phone')email = data.get('email')# 获取前端提交过来的短信验证码# 校验短信验证码verify = data.get('verify')key = "sms_%s" % phoneredis_code = MSG_CACHE.get(key)if verify != str(redis_code):  # str 注意数据类型return JsonResponse({"code": 10112, "error": {"message": "code wrong"}})
...
#注册验证
http://localhost:7000/dadashop/templates/register_sms.html     

OAuth 2.0

授权码模式(authorization code) 广泛使用,其他了解

#微博   微连接创建网页应用
https://open.weibo.com/apps/911505717/info/advanced
应用信息,高级信息,OAuth 2.0,授权回调页:  编辑回调页urlhttp://localhost:7000/dadashop/templates/callback.html#查看OAuth 2.0接口文档
https://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
"""
%E5%BE%AE%E5%8D%9A --》微博API  
涉及到url编码问题,浏览器里带中文的部分,通过urllib编码使用如下
from urllib import parse
date = parse.urlencode(%E5%BE%AE%E5%8D%9A)
print(data)
"""    #授权页示例,换成自己的client_id,和上面设置的回调url看是否进入授权页面
https://api.weibo.com/oauth2/authorize?client_id=123456&redirect_uri=http://www.example.com/response&response_type=code#回调成功后查看url里是否多了code信息
http://www.example.com/response?code=CODE

请求授权

接口功能准备
#utils/weiboapi.py"""第三方微博登录接口API
"""
import requests
from urllib import parse
from django.conf import settingsclass OAuthWeiboAPI:def __init__(self, client_id, client_secret, redirect_uri):self.client_id = client_idself.client_secret = client_secretself.redirect_uri = redirect_uridef get_grant_url(self):"""获取微博授权登录页的地址"""# https://api.weibo.com/oauth2/authorize?client_id=123456&redirect_uri=http://www.example.com/response&response_type=codebase_url = "https://api.weibo.com/oauth2/authorize?"params = {"client_id": self.client_id,"redirect_uri": self.redirect_uri,"response_type": "code"}return base_url + parse.urlencode(params)if __name__ == '__main__':config = {"client_id": "22342872","client_secret": "e2a52dfasdg5d4b9185db1430735","redirect_uri": "http://localhost:7000/dadashop/templates/callback.html"}weibo_api = OAuthWeiboAPI(**config)grant_url = weibo_api.get_grant_url()print(grant_url)# 将打印的url放到浏览器里看是否跳到微博授权页
抓包路由配置
#抓包路由 http://localhost:7000/dadashop/templates/login.html 
http://127.0.0.1:8000/v1/users/weibo/authorization        
#user/urls.py
...# 微博授权登录页: v1/users/weibo/authorizationpath('weibo/authorization', views.OAuthWeiboUrlView.as_view()),
功能函数设计
#user/views.py
...
from utils.weiboapi import OAuthWeiboAPIclass OAuthWeiboUrlView(View):def get(self, request):"""生成授权登录页的地址,返给前端由前端跳转到授权登录页[window.location.href=]"""weibo_api = OAuthWeiboAPI(**settings.WEIBO_CONFIG)oauth_url = weibo_api.get_grant_url()# 返回响应result = {"code": 200, "oauth_url": oauth_url}return JsonResponse(result)

配置试图函数使用的WEIBO_CONFIG

#dashopt/settings.py
...
#############微博登录配置开始############
WEIBO_CONFIG = {"client_id": "9134235717","client_secret": "a6dbdca9b1b185bd762f6b8091","redirect_uri": "http://localhost:7000/dadashop/templates/callback.html"}
前端跳转实现了解
//login.html 
...//异步获取微博登陆地址$.ajax({type:'GET',url:baseUrl+'/v1/users/weibo/authorization',success:function(response){if(response.code==200){window.location.href=response.oauth_url//跳转后端返回的oauth_url}else{alert('服务器异常')}
跳转获取授权码
#注册授权,查看是否跳转
http://localhost:7000/dadashop/templates/callback.html #url跳转授权回调页,
http://localhost:7000/dadashop/templates/callback.html?code=1b710d828a02c3e506bedce5#xhr里自动请求到下一个路由(前端已经设计好了),需要进行下一步功能  
Request URL: http://127.0.0.1:8000/v1/users/weibo/users?code=1b710d828a02c3e506bedce5
前端跳转实现了解
//callback.html
...
<script>var uid = ""var querystring = location.search   //获取查询部分 code=1b710d...window.onload=function(){$.ajax({url: baseUrl+'/v1/users/weibo/users'+querystring,type: 'get',dataType: "json",success: function (res) {if (res.code == 200) {//先清理本地存储,再跳转到主页window.localStorage.clear();window.localStorage.setItem('dashop_token', res.token);window.localStorage.setItem('dashop_user', res.username);$('.query').css({display:"block"})$(".success").css({display:"none"})//none 隐藏了success  form_box注册操作$('.form_box').css({display:"none"})setTimeout(()=>{window.location.href="index.html"//转到主页},3000)  // 3秒等待}else if(res.code == 201){$('.query').css({display:"none"})$(".success").css({display:"none"})$('.form_box').css({display:"block"})// access_token = res.access_tokenuid = res.uid}else{alert(res.error)}}})

获取授权token

https://open.weibo.com/wiki/Oauth2/access_token

HTTP请求方式:POST,请求参数

参数必选类型说明
client_idtruestring第三方应用在微博开放平台注册的APPKEY。
client_secrettruestring在微博开放平台注册的应用所对应的AppSecret。
grant_typetruestring请求的类型,需填写 authorization_code。
codetruestring调用第一步 authorize 接口所获得的授权 code。
redirect_uritruestring授权回调地址,传的值需与在开放平台网站填写的回调地址一致,设置填写位置:“我的应用>应用信息>高级信息”。
配置获取的路由
#user/urls.py  #自动跳转需要的路由
...# 微博登录[获取授权令牌access_token]:v1/users/weibo/userspath('weibo/users', views.OAuthWeiboView.as_view()),
获取toekn功能
#user/views.py
...
import requestsclass OAuthWeiboView(View):def get(self, request):"""生成授权登录页的地址,返给前端由前端跳转到授权登录页[window.location.href=]"""# 1.获取code[查询字符串]code = request.GET.get("code")if not code:return JsonResponse({"code": 10112, "error": "Not code"})# 2.post请求post_url = "https://api.weibo.com/oauth2/access_token"post_data = {"client_id": settings.WEIBO_CONFIG["client_id"],"client_secret": "ab504366dbb185bd762f6b8091","code":code,"grant_type":"authorization_code","redirect_uri":"http://localhost:7000/dadashop/templates/callback.html",}access_html = requests.post(url=post_url,data=post_data).json()print('---------------get access token---------')print(access_html)return JsonResponse({'code': 200})
#浏览器里重新微博登录下,授权3秒等待再跳转到主页  见上面的前端跳转实现了解
xhr请求 Request URL: http://127.0.0.1:8000/v1/goods/index #需设计#终端查看获得的token
...."GET /v1/users/weibo/authorization HTTP/1.1" 200 189
---------------get access token---------
{'access_token': '2.00mytczH0HRagz1699aJeq4NC', 'remind_in': '157679999', 'expires_in': 157679999, 'uid': '73207972', 'isRealName': 'true'}
优化到工具类里
#utils/weiboapi.py
import requests
from django.conf import settings
#...
class OAuthWeiboAPI:
#...def get_access_token(self, code):"""获取access_token接口"""post_url = "https://api.weibo.com/oauth2/access_token"post_data = {"client_id": settings.WEIBO_CONFIG["client_id"],"client_secret": settings.WEIBO_CONFIG["client_secret"],"grant_type": "authorization_code","code": code,"redirect_uri":settings.WEIBO_CONFIG["redirect_uri"]}access_html = requests.post(url=post_url, data=post_data).json()# 获取access_token成功if access_html.get("access_token"):return access_htmlraise Exception("get access token failed")
#user/views.py
#....# 2.post请求try:weibo_api = OAuthWeiboAPI(**settings.WEIBO_CONFIG)access_html = weibo_api.get_access_token(code)except Exception as e:print(e)return JsonResponse({"code": 10113, "error": "weibo server is busy"})# 成功获取到access_tokenprint('---- get access token success ----')print(access_html)return JsonResponse({'code': 200})

验证

#重新注册,查看跳转,token打印,准备设计表,入库token
{'access_token': '2.00mytczH0HRagz1699aJeq4NC', 'remind_in': '157679999', 'expires_in': 157679999, 'uid': '73207972', 'isRealName': 'true'
}

token入库表设计

#user/models.py
...
class WeiboProfile(BaseModel):"""微博用户表"""# 外键 和用户表一对一# 因为微博数据存入时,可能还没有正式用户,设置外键允许为nulluser_profile = models.OneToOneField(UserProfile, on_delete=models.CASCADE, null=True)# db_index:因为后期大量查询wuid = models.CharField(verbose_name="微博uid", max_length=10, db_index=True, unique=True)access_token = models.CharField(verbose_name="微博授权令牌", max_length=32)class Meta:db_table = "user_weibo_profile"> python manage.py makemigrations
> python manage.py migrate        
前端根据返回状态码返回页面
//callback.html
...
<script>var uid = ""var querystring = location.search   //获取查询部分 code=1b710d...window.onload=function(){$.ajax({url: baseUrl+'/v1/users/weibo/users'+querystring,type: 'get',dataType: "json",success: function (res) {if (res.code == 200) {//先清理本地存储,再跳转到主页window.localStorage.clear();window.localStorage.setItem('dashop_token', res.token);window.localStorage.setItem('dashop_user', res.username);//block显示,none隐藏  根据返回的201  200 跳转页面       $('.query').css({display:"block"})// 请稍后$(".success").css({display:"none"})//登录成功//none 隐藏了success  $('.form_box').css({display:"none"})// 输入登录名、手机号信息绑定setTimeout(()=>{window.location.href="index.html"//转到主页},3000)  // 3秒等待}else if(res.code == 201){$('.query').css({display:"none"})$(".success").css({display:"none"})$('.form_box').css({display:"block"})// access_token = res.access_tokenuid = res.uid}else{alert(res.error)}}})
#user/views.py
from .models import Address, WeiboProfile
#....        # 2.post请求try:weibo_api = OAuthWeiboAPI(**settings.WEIBO_CONFIG)access_html = weibo_api.get_access_token(code)except Exception as e:print(e)return JsonResponse({"code": 10113, "error": "weibo server is busy"})# 成功获取到access_tokenprint('---- get access token success ----')print(access_html)# 获取wuid和access_tokenwuid = access_html.get('uid')access_token = access_html.get('access_token')"""微博表中查看该wuid是否存在情况1:用户第一次微博登录[201]情况2:用户之前扫码登录过2.1 已经和正式用户绑定过[200]2.2 在绑定注册页不填写用户名手机号信息,关闭页面[201]200响应:{"code":200, "username":xxx, "token": token}201响应:{"code"201,"uid": wuid}"""try:weibo_user = WeiboProfile.objects.get(wuid=wuid)except Exception as e:# 用户第一次扫码登录WeiboProfile.objects.create(wuid=wuid, access_token=access_token)# 返回201,到绑定注册页return JsonResponse({"code": 201, "uid": wuid})else:# 情况1:已和正式用户绑定# 情况2:扫过码,但是并未绑定user = weibo_user.user_profileif user:token = make_token(user.username)result = {"code": 200,"username": user.username,"token": token}return JsonResponse(result)else:result = {"code": 201,"uid": wuid}return JsonResponse(result)

验证

#登录页注册再次提交,授权登录验证  因第一次,返回201  进入绑定手机号邮箱页面
http://localhost:7000/dadashop/templates/callback.html?code=3743ffa4c057f33c26d1e85fc36c23e3#补充信息提交,
Request URL: http://127.0.0.1:8000/v1/users/weibo/users  405 Method Not AllowedPayload: {"uid": "736547972","username": "user03","password": "123456","phone": "17723452345","email": "65733058@qq.com"}设计提交试图,获取数据,完成绑定

设计提交功能

#user/views.py
class OAuthWeiboView(View):
#...def post(self, request):"""绑定注册视图逻辑1.获取请求体数据2.存入用户表[UserProfile]3.两个用户绑定[更新外键-user_profile]4.组织数据返回"""data = json.loads(request.body)username = data.get("username")password = data.get("password")email = data.get("email")phone = data.get("phone")uid = data.get("uid")# 处理密码m = md5()m.update(password.encode())pwd_md5 = m.hexdigest()# 创建正式用户[create]并和微博用户绑定[update]# 事务with transaction.atomic():sid = transaction.savepoint()try:# 创建正式用户[UserProfile]user = UserProfile.objects.create(username=username, password=pwd_md5, email=email, phone=phone)# 更新外键[WeiboProfile]weibo_user = WeiboProfile.objects.get(wuid=uid)weibo_user.user_profile = userweibo_user.save()except Exception as e:print("bind user error", e)# 回滚transaction.savepoint_rollback(sid)return JsonResponse({"code": 10114, "error": "database error"})# 提交事务transaction.savepoint_commit(sid)# 1.发送激活邮件verify_url = get_verify_url(username) #下面重构功能函数async_send_active_email.delay(email, verify_url)# 2.签发tokentoken = make_token(username)# 3.组织数据返回result = {"code": 200,"username": username,"token": token}return JsonResponse(result)

功能函数:生成邮件激活链接

#user/views.pydef get_verify_url(uname):"""功能函数:生成邮件激活链接"""# http://127.0.0.1:7000/dadashop/templates/active.html?code=xxx# code: base64(1016_username)code_num = "%d" % random.randint(1000, 9999)code_str = "%s_%s" % (code_num, uname)code = base64.urlsafe_b64encode(code_str.encode()).decode()# 存入redis[key-value] email_active_usernamekey = "email_active_%s" % unameCODE_MSG.set(key, code_num, 3600 * 24 * 3)# 生成激活链接verify_url = "http://127.0.0.1:7000/dadashop/templates/active.html?code=%s" % codereturn verify_url

再次注册验证

#登录,注册,授权,绑定邮箱信息  ,收件箱

二、微博登录流程梳理

  • 微博开放平台

    • 注册微博开放平台用户,并进行实名认证

    • 创建应用

      • 控制台-应用基本信息:App Key 、App Secret
      • 控制台-应用高级信息:设置回调地址
    • 关于回调地址

      回调地址不能出现127.0.0.1,必须为域名[localhost]

  • 第三方微博登录功能梳理

    • 用户:登录页点击微博登录,xhr请求到后端索要微博授权登录页地址

    • 后端:视图函数中生成微博授权登录页地址【微博接口文档】,返给前端

    • 前端:重定向到微博授权登录页地址【login.html】

      window.location.href=response.oauth_url

    • 用户:输入微博账号和密码 或者 扫码,确认授权并登录

    • 微博:校验微博账号和密码信息,如果正确则跳转到回调地址【微博开放平台设置】,在回调地址中添加授权码的查询参数

    • 前端:移花接木,把授权码code从回调地址【7000端口】取出来,放到后端路由【8000端口】发送xhr请求

      var querystring = location.search
      $.ajax({url:baseUrl+'v1/users/weibo/users' + querystring
      })
      
    • 后端:获取授权码[request.GET.get()],向微博发请求【微博开发文档】获取授权令牌【access_token】

      {“uid”:“xxx”,“access_token”:“xxx”,…}

    • 后端:获取到授权令牌后,创建微博表并存储数据,并执行绑定注册流程

      后端和前端协商状态码:

      200: 说明用户之前已经使用微博登录过并和正式用户做了绑定,直接签发token并跳转到主页【index.html】

      201:说明用户之前并没有和正式用户绑定过,跳转到绑定注册页面

    • 前端:根据状态码决定页面跳转

      200:跳转到index.html

      201:跳转到绑定注册页面【让用户填写注册相关信息】

    • 用户:填写注册信息,点击提交,发送xhr请求到后端

    • 后端:把该用户存入正式用户表并和当前微博用户做好关联

access_token使用:服务器端获取到该用户的access_token后,可以在微博开放平台-我的应用-接口管理,获取该用户的相关资源【微博开放出来的资源】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qV8dt0GN-1688875149467)(project-pictures/09_第三方微博登录流程图.png)]

pip切换源

sudo pip3 install 模块名 -i https://pypi.tuna.tsinghua.edu.cn/simple/1.阿里云 http://mirrors.aliyun.com/pypi/simple/
2.豆瓣http://pypi.douban.com/simple/
3.清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
4.中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
5.华中科技大学http://pypi.hustunique.com/   pip3 freeze | grep -i  'redis'    
> pip3  install django_redis -i https://pypi.tuna.tsinghua.edu.cn/simple/
> 离线安装- 下载安装包[官网].tar.gz- 解压:tar -zxvf  xxx.tar.gz- 到解压目录寻找:setup.py   [README文件中有安装说明]- 安装:sudo python3 setup.py  install     > python manage.py shell
>>> from django.core.cache import cache
>>> cache.set("zhaoliying",1016)
True  #  redis  里1号库查看验证,默认过期的事件是300s

:说明用户之前并没有和正式用户绑定过,跳转到绑定注册页面

  • 前端:根据状态码决定页面跳转

    200:跳转到index.html

    201:跳转到绑定注册页面【让用户填写注册相关信息】

  • 用户:填写注册信息,点击提交,发送xhr请求到后端

  • 后端:把该用户存入正式用户表并和当前微博用户做好关联

access_token使用:服务器端获取到该用户的access_token后,可以在微博开放平台-我的应用-接口管理,获取该用户的相关资源【微博开放出来的资源】

[外链图片转存中…(img-qV8dt0GN-1688875149467)]

pip切换源

sudo pip3 install 模块名 -i https://pypi.tuna.tsinghua.edu.cn/simple/1.阿里云 http://mirrors.aliyun.com/pypi/simple/
2.豆瓣http://pypi.douban.com/simple/
3.清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
4.中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
5.华中科技大学http://pypi.hustunique.com/   pip3 freeze | grep -i  'redis'    
> pip3  install django_redis -i https://pypi.tuna.tsinghua.edu.cn/simple/
> 离线安装- 下载安装包[官网].tar.gz- 解压:tar -zxvf  xxx.tar.gz- 到解压目录寻找:setup.py   [README文件中有安装说明]- 安装:sudo python3 setup.py  install     > python manage.py shell
>>> from django.core.cache import cache
>>> cache.set("zhaoliying",1016)
True  #  redis  里1号库查看验证,默认过期的事件是300s

相关文章:

pt36项目短信OAth2.0

5、短信验证码 1、注册容联云账号&#xff0c;登录并查看开发文档&#xff08;以下分析来自接口文档&#xff09; 2、开发文档【准备1】&#xff1a;请求URL地址1.示例&#xff1a;https://app.cloopen.com:8883/2013-12-26/Accounts/{}/SMS/TemplateSMS?sig{}ACCOUNT SID# s…...

教师们如何一对一私发成绩?

在传统的教育中&#xff0c;老师通常会通过班级群或家长会等方式发布学生的成绩信息。然而&#xff0c;这种公开的方式可能会让一些学生感到尴尬和不安&#xff0c;因为他们可能不愿意让其他人知道他们的成绩情况。为了解决这个问题&#xff0c;今天我就给老师们推荐一款免费的…...

12.11

1.q&#xff0c;w&#xff0c;e亮led1&#xff0c;2&#xff0c;3&#xff1b; a&#xff0c;s&#xff0c;d灭led1&#xff0c;2&#xff0c;3&#xff1b; main.c #include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i0;i<ms;i){for…...

Spring JdbcTemplate

一、简介 Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作。它是 spring 框架中提供的一个对象&#xff0c;是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多的操作模板类。 针对操作关系型数据&#xff1a; jdbcTemplateHibe…...

力扣编程题算法初阶之双指针算法+代码分析

目录 第一题&#xff1a;复写零 第二题&#xff1a;快乐数&#xff1a; 第三题&#xff1a;盛水最多的容器 第四题&#xff1a;有效三角形的个数 第一题&#xff1a;复写零 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路&#xff1a; 上期…...

实现安装“自由化”!在Windows 11中如何绕过“您尝试安装的应用程序未通过微软验证”

这篇文章描述了如果你不能安装应用程序,而是当你在Windows 11中看到消息“您尝试安装的应用程序未通过微软验证”时该怎么办。完成这些步骤将取消你安装的应用程序必须经过Microsoft验证的要求。 使用设置应用程序 “设置”应用程序提供了绕过此警告消息的最简单方法,以便你…...

【mysql】下一行减去上一行数据、自增序列场景应用

背景 想获取if_yc为1连续账期数据 思路 获取所有if_yc为1的账期数据下一行减去上一行账期&#xff0c;如果为1则为连续&#xff0c;不等于1就为断档获取不等于1的最小账期&#xff0c;就是离当前账期最近连续账期 代码 以下为mysql语法&#xff1a; select acct_month f…...

CLIP在Github上的使用教程

CLIP的github链接&#xff1a;https://github.com/openai/CLIP CLIP Blog&#xff0c;Paper&#xff0c;Model Card&#xff0c;Colab CLIP&#xff08;对比语言-图像预训练&#xff09;是一个在各种&#xff08;图像、文本&#xff09;对上进行训练的神经网络。可以用自然语…...

入职字节外包一个月,我离职了。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…...

SpringBoot的web开发

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 web开发1 web场景1.1 自动配置1.2 默认效果 &#x1f48e;总结 web开发 SpringBoot的web开发能力是由SpringMVC提供的 1 web场景 1.1 自动配置 整合web场景 <dependency><groupId>org.springframewo…...

传染病传播速度

题干 R0值是基本传染数的简称&#xff0c;指的是在没有采取任何干预措施的情况下&#xff0c;平均每位感染者在传染期内使易感者个体致病的数量。数字越大说明传播能力越强&#xff0c;控制难度越大。一个人传染的人的数量可以用幂运算来计算。假设奥密克戎的R0为10&#xff0…...

前端打包环境配置步骤

获取node安装包并解压 获取node安装包 wget https://npmmirror.com/mirrors/node/v16.14.0/node-v16.14.0-linux-x64.tar.xz 解压 tar -xvf node-v16.14.0-linux-x64.tar.xz 创建软链接 sudo ln -s 此文件夹的绝对路径/bin/node /usr/local/bin/node&#xff0c;具体执行如下…...

css的4种引入方式--内联样式(标签内style)、内部样式表(<style>)、外部样式表(<link>、@import)

1.内联样式&#xff08;Inline Styles&#xff09;&#xff1a;可以直接在HTML元素的style属性中定义CSS样式。 例如&#xff1a; <p style"color: red; font-size: 16px;">这是一段红色的文本</p>内联样式适用于对单个元素应用特定的样式&#xff0c;…...

GPT-4 变懒了?官方回复

你是否注意到&#xff0c;最近使用 ChatGPT 的时候&#xff0c;当你向它提出一些问题&#xff0c;却得到的回应似乎变得简短而敷衍了&#xff1f;对于这一现象&#xff0c;ChatGPT 官方给出了回应。 译文&#xff1a;我们听到了你们所有关于 GPT4 变得更懒的反馈&#xff01;我…...

编译器和 IR:LLVM IR、SPIR-V 和 MLIR

编译器通常是各种开发工具链中的关键组件&#xff0c;可提高开发人员的工作效率。编译器通常用作独立的黑匣子&#xff0c;它使用高级源程序并生成语义上等效的低级源程序。不过&#xff0c;它仍然是内部结构倾向的;内部之间流动的内容就称为中间表示 &#xff08;IR&#xff0…...

蓝牙物联网对接技术难点有哪些?

#物联网# 蓝牙物联网对接技术难点主要包括以下几个方面&#xff1a; 1、设备兼容性&#xff1a;蓝牙技术有多种版本和规格&#xff0c;如蓝牙4.0、蓝牙5.0等&#xff0c;不同版本之间的兼容性可能存在问题。同时&#xff0c;不同厂商生产的蓝牙设备也可能存在兼容性问题。 2、…...

漫谈Uniapp App热更新包-Jenkins CI/CD打包工具链的搭建

零、写在前面 HBuilderX是DCloud旗下的IDE产品&#xff0c;目前只提供了Windows和Mac版本使用。本项目组在开发阶段经常需要向测试环境提交热更新包&#xff0c;使用Jenkins进行CD是非常有必要的一步。尽管HBuilderX提供了CLI&#xff0c;但Jenkins服务通常都是搭建在Linux环境…...

Axure简单安装与入门

目录 一.Axure简介 二.应用场景 三.安装与汉化 3.1.安装 3.2.汉化 四. 入门 4.1.复制、剪切及粘贴区域 4.2.选择模式 4.3. 插入形状 4.4.预览、共享 感谢大家观看&#xff01;希望能帮到你哦&#xff01;&#xff01;&#xff01; 一.Axure简介 Axure RP是一款专业的原型…...

前端知识笔记(四十五)———前端开发与后端开发有什么区别

前端开发和后端开发是Web开发中的两个关键领域&#xff0c;它们负责不同的任务和功能。下面是前端开发和后端开发之间的主要区别&#xff1a; 前端开发&#xff1a; 用户界面&#xff1a;前端开发主要关注用户界面的开发&#xff0c;包括网页的布局、样式、交互等方面。前端技…...

Jol-分析Java对象的内存布局

Jol-分析Java对象的内存布局 Open JDK提供的JOL(Java Object Layout)工具为我们方便分析、了解一个Java对象在内存当中的具体布局情况。本文实验环境为64位HotSpot虚拟机。 Java对象的内存布局 Java的实例对象、数组对象在内存中的组成包括&#xff1a;对象头、实例数据和内存…...

基于sfunction builder的c-sfunction编写及案例测试分析

目录 前言 1.前期准备工作及文件说明 1.1前期准备工作 1.2 文件说明 1.3 编译方式...

【Java期末复习资料】(1)知识点总结

本文章主要是知识点&#xff0c;后续会出模拟卷 以下是选择、填空可能考的知识点&#xff0c;多看几遍&#xff0c;混个眼熟 面向对象程序设计的基本特征是&#xff1a;抽象、封装、继承、多态&#xff08;后三个是三大特性&#xff09;Java源文件的扩缀名是.java编译Java App…...

进程、容器与虚拟机的区别

进程、容器与虚拟机 参考&#xff1a;关于进程、容器与虚拟机的区别&#xff0c;你想知道的都在这&#xff01; 进程、容器与虚拟机的结构图 进程 介绍 进程是一个正在运行的程序&#xff0c;它是一个个可执行文件的实例。当一个可执行文件从硬盘加载到内存中的时候&#xf…...

全网快递批量查询的得力助手

在当今社会&#xff0c;网络购物已经成为人们日常生活的重要组成部分。随着网购的普及&#xff0c;快递行业也迅速发展壮大。然而&#xff0c;这也带来了一系列问题&#xff1a;如何快速、准确地查询快递信息&#xff1f;如何批量查询多个快递&#xff1f;今天&#xff0c;我们…...

uniapp开发小程序经验记录

uniapp开发小程序的过程中会遇到很多问题&#xff0c;这里记录一下相关工具优化&#xff0c;便于后来者参考。 每次保存代码后&#xff0c;小程序都跳回首页 针对这个问题&#xff0c;常规的做法就是修改pages配置文件&#xff0c;但是这种方式不便于路由参数的设置&#xff…...

PR自动剪辑视频工具AI智能剪辑插件AutoPod

推荐一款可以提高剪辑效率&#xff0c;节约时间成本的AI人工智能自动剪辑视频制作工具pr插件Autopod&#xff0c;辅助你更快地完成视频内容的编辑工作。 Autopod 插件是一款应用于 Adobe Premiere Pro 软件的插件&#xff0c;用于自动剪辑。该插件能够识别和处理视频和音频素材…...

Visual Studio 2022+Python3.11实现C++调用python接口

大家好&#xff01;我是编码小哥&#xff0c;欢迎关注&#xff0c;持续分享更多实用的编程经验和开发技巧&#xff0c;共同进步。 查了一些资料&#xff0c;不是报这个错&#xff0c;就是报哪个错&#xff0c;没有找到和我安装的环境的一致的案例&#xff0c;于是将自己的摸索分…...

10天玩转Python第2天:python判断语句基础示例全面详解与代码练习

目录 1.课程之前1.1 复习和反馈1.2 作业1.3 今日内容1.4 字符串格式化的补充1.5 运算符1.5.1 逻辑运算符1.5.2 赋值运算符1.5.3 运算符优先 2.判断2.1 if 的基本结构2.1.1 基本语法2.1.2 代码案例2.1.3 练习 2.2 if else 结构2.2.1 基本语法2.2.2 代码案例2.2.3 练习 2.3 if 和…...

2024年网络安全竞赛-网站渗透

网站渗透 (一)拓扑图 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; 使用nmap工具对靶机进行信息收集 2.使用渗透机对服务器信息收集,将网站的名称作为flag提交; 访问页面即可 3.使用渗透机对服务器渗透,将可渗透页面的名称作为flag提交…...

kafka学习笔记--基础知识概述

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…...