pt36项目短信OAth2.0

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/215410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装与使用

Docker 1.初识Docker Docker如何解决大型项目依赖关系复杂&#xff0c;不同组件依赖的兼容性问题&#xff1f; Docker允许开发中将应用、依赖、函数库、配置一起打包&#xff0c;形成可移植镜像Docker应用运行在容器中&#xff0c;使用沙箱机制&#xff0c;相互隔离 Docker…

phpstorm中使用 phpunit 时的配置和代码覆盖率测试注意点

初始化一个composer项目&#xff0c;composer.json配置文件如下 {"name": "zingfront/questions-php","type": "project","require": {"php": "^7.4"},"require-dev": {"phpunit/phpun…

geemap学习笔记024:从Earth Engine中获取遥感图像的缩略图

前言 遥感图像的缩略图通常是以较小的数据量对整景影像有一个全面的展示&#xff0c;便于分享和观察&#xff0c;本节就介绍一下如何获取遥感图像的缩略图。 1 导入库并显示地图 import ee import geemap import osee.Initialize() Map geemap.Map() Map2 加载数据 roi e…

多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-BiLSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-…

项目管理工具:选品开发管理的最佳实践

Zoho Projects是一个功能强大的项目管理工具&#xff0c;可以帮助电商企业实现选品开发过程的有序管理&#xff0c;提升选品开发效率。 以下是使用Zoho Projects进行选品开发管理的步骤&#xff1a; 1.创建项目&#xff1a; 登录Zoho Projects&#xff0c;在主页上点击"新…

NSSCTF Crypto靶场练习,21-30wp

文章目录 [AFCTF 2018]你能看出这是什么加密么[LitCTF 2023]你是我的关键词(Keyworld)[NSSCTF 2022 Spring Recruit]classic[SWPUCTF 2021 新生赛]crypto4[LitCTF 2023]家人们&#xff01;谁懂啊&#xff0c;RSA签到都不会 (初级)[SWPUCTF 2021 新生赛]crypto5[LitCTF 2023]Is …

亚信科技AntDB携手蓝凌软件,助推企业数字化办公转型升级

随着企业数字化转型的深入&#xff0c;企业对于协同办公、移动门户、数字运营、智能客服等方面的需求越来越高&#xff0c;数智化正成为催生新动能和新优势的关键力量。数字化的办公平台可以帮助企业实现各类信息、流程的集中化、数字化和智能化管理&#xff0c;为企业管理者提…

面试 JVM 八股文五问五答第一期

面试 JVM 八股文五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.JVM内存布局 Heap (堆区&#xff09; 堆是 OOM 故障最主要的发生区域。它是内存…

大数据毕业设计之前端03:logo、menu的折叠展开实现

关键字&#xff1a;BuildAdmin、pinia、logo、aside、menu、菜单折叠、Vue、ElementUI 前言 上一篇文章中&#xff0c;借助aside的实现讲了一些开发的小技巧&#xff0c;以及css的解读。本篇文章主要写一下如何填充aside的内容。 aside主要是由两个部分组成的&#xff1a;log…

数据结构与算法-Rust 版读书笔记-2线性数据结构-栈

数据结构与算法-Rust 版读书笔记-2线性数据结构-栈 一、线性数据结构概念 数组、栈、队列、双端队列、链表这类数据结构都是保存数据的容器&#xff0c;数据项之间的顺序由添加或删除时的顺序决定&#xff0c;数据项一旦被添加&#xff0c;其相对于前后元素就会一直保持位置不…

电脑入门基础知识

1.电脑键盘个数一般都是有多少个&#xff1f; 答&#xff1a;一般情况下&#xff0c;电脑键盘只有一个。但是&#xff0c;也有一些特殊的情况&#xff0c;例如游戏玩家可能会使用额外的游戏键盘&#xff0c;或者一些专业人士可能会使用多个键盘来提高工作效率。但是在大多数情…

[Spring~源码] ControllerAdvice揭秘

在Spring MVC中&#xff0c;我们经常使用ControllerAdvice注解&#xff0c;可以实现全局统一异常处理、全局数据绑定等功能。但是&#xff0c;它的实现原理是什么呢&#xff1f;在本文中&#xff0c;我们将深入探究ControllerAdvice的实现原理。 文章目录 什么是ControllerAdvi…

docker-compose.yml文件配置详解

简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YML 文件来配置应用程序需要的所有服务。然后&#xff0c;使用一个命令&#xff0c;就可以从 YML 文件配置中创建并启动所有服务。 docker compose文件是一个yaml格式的文件&a…

【Hadoop_04】HDFS的API操作与读写流程

1、HDFS的API操作1.1 客户端环境准备1.2 API创建文件夹1.3 API上传1.4 API参数的优先级1.5 API文件夹下载1.6 API文件删除1.7 API文件更名和移动1.8 API文件详情和查看1.9 API文件和文件夹判断 2、HDFS的读写流程&#xff08;面试重点&#xff09;2.1 HDFS写数据流程2.2 网络拓…

学会面向对象经典练习题21道

1.面向对象练习&#xff1a;设计小狗类 需求&#xff1a; 抽象形成一个小狗类Dog 属性&#xff1a;名字name 年龄age 品种kind 主人host 价格price 功能&#xff1a; 跑run&#xff1a;无参&#xff0c;打印&#xff1a;小狗Dog跑的老快了~ 吃eat&#xff1a;参数int n&#x…

当MongoDB主键为String时,mongoTemplate无法根据id查询的问题

MongoDB推荐使用ObjectId作为主键&#xff0c;但国内的开发都知道&#xff0c;事情往往不如人所愿&#xff0c;当我们真的出现了“_id”主键的类型为String时&#xff0c;且还必须想用mongoTemplate.findOne或findList时&#xff0c;直接使用该方法会导致查询结果为空。 因为m…

https 协议

目录 加密方式 对称加密 非对称加密 非对称加密 非对称加密 非对称加密 对称加密 AC证书 AC证书内容 数据摘要 数据签名 在我们前面学习的http协议里面&#xff0c;我们发送的内容都是明文传输的&#xff0c;所以在安全上并不安全&#xff0c;但是在现在信息发达的时…

Java高级技术:优化性能与扩展性的最佳实践

标题&#xff1a;Java高级技术&#xff1a;优化性能与扩展性的最佳实践 摘要&#xff1a;本文将介绍Java中一些高级技术&#xff0c;以提高性能和代码的扩展性。本文不包括反射和并发编程&#xff0c;旨在帮助开发者进一步提升Java应用程序的质量和可维护性。 优化性能的最佳实…

面试题目总结(三)

1. Spring、Springboot、springMVC、Spring Cloud 的区别&#xff1a; Spring&#xff1a;Spring 是一个开源的、轻量级的Java框架&#xff0c;提供了丰富的功能和组件&#xff0c;用于构建企业级应用程序。Spring框架包含了很多模块&#xff0c;包括核心容器、数据访问、事物…

MATLAB算法实战应用案例精讲-【数模应用】漫谈机器学习(七)

目录 几个高频面试题目 机器学习算法工程师需要掌握哪些编程语言? 1.Python 2. C# 3.JavaScript 4. R 5.Java