日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

vue_drf實現(xiàn)短信驗證碼

瀏覽:126日期:2022-09-28 11:08:18
目錄一、需求1,需求二、sdk參數(shù)配置1,目錄結(jié)構三、代碼實現(xiàn)1,后端代碼2,前端代碼一、需求1,需求

我們在做網(wǎng)站開發(fā)時,登錄頁面很多情況下是可以用手機號接收短信驗證碼,然后實現(xiàn)登錄的,那我們今天就來做一做這一功能。

vue_drf實現(xiàn)短信驗證碼

偽代碼:

進入登錄頁面,點擊短信登錄輸入手機號碼,點擊獲取驗證碼,后端在redis里保存驗證碼用戶把手機收到的驗證碼輸入,點擊登錄,會把手機號和驗證碼發(fā)往后端,然后進行驗證

要想發(fā)送短信,讓用戶收到短信,我們的借助一個容聯(lián)云的接口,注冊一個賬號。

vue_drf實現(xiàn)短信驗證碼

使用時需要的一些參數(shù):

vue_drf實現(xiàn)短信驗證碼

下載sdk

1.。。。。。。。

vue_drf實現(xiàn)短信驗證碼

2.。。。。。。

vue_drf實現(xiàn)短信驗證碼

3.。。。。。。。

vue_drf實現(xiàn)短信驗證碼

下載完成后,解壓。放入我們drf項目的apps里的libs里

二、sdk參數(shù)配置1,目錄結(jié)構

vue_drf實現(xiàn)短信驗證碼

2,配置sms.py文件

# -*- coding:utf-8 -*-from .CCPRestSDK import REST# 說明:主賬號,登陸云通訊網(wǎng)站后,可在'控制臺-應用'中看到開發(fā)者主賬號ACCOUNT SID_accountSid = ’xxxxxxxxxxxxx’# 8a216da863f8e6c20164139687e80c1b# 說明:主賬號Token,登陸云通訊網(wǎng)站后,可在控制臺-應用中看到開發(fā)者主賬號AUTH TOKEN_accountToken = ’xxxxxxxxxxxxx’# 6dd01b2b60104b3dbc88b2b74158bac6# 請使用管理控制臺首頁的APPID或自己創(chuàng)建應用的APPID_appId = ’8aaf0708697b6beb01699f3c645f1766’# 8a216da863f8e6c20164139688400c21# 說明:請求地址,生產(chǎn)環(huán)境配置成app.cloopen.com_serverIP = ’sandboxapp.cloopen.com’# 說明:請求端口 ,生產(chǎn)環(huán)境為8883_serverPort = '8883'# 說明:REST API版本號保持不變_softVersion = ’2013-12-26’#下面的內(nèi)容不用修改class CCP(object): '''發(fā)送短信的輔助類''' def __new__(cls, *args, **kwargs):# 判斷是否存在類屬性_instance,_instance是類CCP的唯一對象,即單例if not hasattr(CCP, '_instance'): cls._instance = super(CCP, cls).__new__(cls, *args, **kwargs) cls._instance.rest = REST(_serverIP, _serverPort, _softVersion) cls._instance.rest.setAccount(_accountSid, _accountToken) cls._instance.rest.setAppId(_appId)return cls._instance def send_template_sms(self, to, datas, temp_id):'''發(fā)送模板短信'''# @param to 手機號碼# @param datas 內(nèi)容數(shù)據(jù) 格式為數(shù)組 例如:{’12’,’34’},如不需替換請?zhí)?’’# @param temp_id 模板Idresult = self.rest.sendTemplateSMS(to, datas, temp_id)# 如果云通訊發(fā)送短信成功,返回的字典數(shù)據(jù)result中statuCode字段的值為'000000'if result.get('statusCode') == '000000': # 返回0 表示發(fā)送短信成功 return 0else: # 返回-1 表示發(fā)送失敗 return -1if __name__ == ’__main__’: ccp = CCP() # 注意: 測試的短信模板編號為1 ccp.send_template_sms(’15914397060’, [’1234’, 5], 1)三、代碼實現(xiàn)1,后端代碼

views.py,這是獲取驗證碼請求的處理,也就是后端產(chǎn)生一個隨機碼,發(fā)送給手機用戶,然后把隨機碼存儲于redis中,然后給前端返回一個驗證碼發(fā)送成功的信號

from .models import Userfrom rest_framework import statusfrom lufei_drf.libs.yuntongxun.sms import CCPfrom django_redis import get_redis_connectionclass SMSCodeAPIView(APIView): def get(self,request):# 1. 通過查詢字符串獲取手機號碼phone = request.query_params.get('phone')ty=request.query_params.get(’type’)# 2. 發(fā)送短信之前驗證碼驗證一下手機號碼if ty==’register’: try:User.objects.get(phone=phone)return Response({'message': '當前手機號已經(jīng)被注冊過'}, status=status.HTTP_400_BAD_REQUEST) except:passredis = get_redis_connection('sms_code')if redis.get('times_%s' % phone): return Response({'message': '當前手機號已經(jīng)在一分鐘內(nèi)發(fā)送過短信'}, status=status.HTTP_400_BAD_REQUEST)# 3. 使用手機號碼發(fā)送短信驗證碼# 生成一個短信驗證碼sms_code = '%04d' % random.randint(0, 9999)ccp = CCP()result = ccp.send_template_sms(phone,[sms_code,'5分鐘'],1)if result == 0: # 發(fā)送短信成功,保存短信驗證碼到redis數(shù)據(jù)庫中 # 開啟管道操作 pl = redis.pipeline() pl.multi() # 接下來會在管道中執(zhí)行多條命令 # setex(變量名,有效期[秒],值 ) SMS_EXPIRE_TIME = 5 * 60 # 短信驗證碼的有效期 SMS_TIMES = 60 # 短信發(fā)送的間隔時間 # 把原來立即執(zhí)行的命令放置到管道 pl.setex('sms_%s' % phone, SMS_EXPIRE_TIME, sms_code) pl.setex('times_%s' % phone, SMS_TIMES, 1) # 統(tǒng)一執(zhí)行管道中的命令 pl.execute()# 4. 響應數(shù)據(jù)給客戶端return Response({'message':result},status=status.HTTP_200_OK)

urls.py

from django.urls import path# jwt內(nèi)部實現(xiàn)的登陸視圖from rest_framework_jwt.views import obtain_jwt_tokenfrom .views import SMSCodeAPIView,urlpatterns=[ path(r'login/', obtain_jwt_token ), path(’sms/’,SMSCodeAPIView.as_view()),]

utils.py,這是對用戶提交手機驗證碼后,對手機號和驗證碼的校對。判斷都正確后,返回一個對象,包括token,user信息等,

from django.contrib.auth.backends import ModelBackendfrom django_redis import get_redis_connectiondef jwt_response_payload_handler(token, user=None, request=None): ''' 自定義jwt認證成功返回數(shù)據(jù) :token 返回的jwt :user 當前登錄的用戶信息[對象] :request 當前本次客戶端提交過來的數(shù)據(jù) ''' return {’token’: token,’id’: user.id,’username’: user.username, }#實現(xiàn)多功能登錄import refrom .models import User#查找用戶名或手機號是否已經(jīng)是我們的用戶def get_user_by_account(account): ''' 根據(jù)帳號獲取user對象 :param account: 賬號,可以是用戶名,也可以是手機號 :return: User對象 或者 None ''' try:if re.match(’^1[3-9]d{9}$’, account): # 帳號為手機號 user = User.objects.get(phone=account)else: # 帳號為用戶名 user = User.objects.get(username=account) except User.DoesNotExist:return None else:return user#驗證用戶提交的短信和我們保存在redis里的信息是否一致def sms_code_verify(phone,sms_code): redis = get_redis_connection('sms_code') value=redis.get(’sms_%s’%phone).decode() if value==sms_code:return True return Falseclass UsernameMobileAuthBackend(ModelBackend): ''' 自定義用戶名或手機號認證 ''' def authenticate(self, request, username=None, password=None, **kwargs):user = get_user_by_account(username)#當密碼長度為4時,我判斷其為手機號和短信驗證碼登錄if len(password)==4 and user is not None and sms_code_verify(username,password): return userelif user is not None and user.check_password(password): return userelse: return None2,前端代碼

login組件

<template> <div id='login'> <div class='box'> <p><img src='http://www.b3g6.com/assets/login_title.png' alt=''> </p> <p class='sign'>幫助有志向的年輕人通過努力學習獲得體面的工作和生活!</p> <div v-show='num==1'><div class='title2 cursor'> <span @click='num=1' :class='num==1 ? ’show’ :’’'>密碼登錄</span> <span @click='num=2' :class='num==2 ? ’show’ :’’'>短信登錄</span></div><input v-model='username' type='text' placeholder='用戶名 / 手機號碼'><input v-model='password' type='password' placeholder='密碼'><div class='ss'></div><div class='t1'> <div class='left'> <input type='checkbox' v-model='remenber'> <div >記住密碼</div> </div> <div class='right cursor'>忘記密碼</div></div><button @click='login1'>登錄</button><div class='register'> 沒有賬號 <span><router-link to='/register'>立即注冊</router-link></span></div> </div> <div v-show='num==2'><div class='title2 cursor'> <span @click='num=1' :class='num==1 ? ’show’ :’’'>密碼登錄</span> <span @click='num=2' :class='num==2 ? ’show’ :’’'>短信登錄</span></div><input v-model='phone' type='text' placeholder='手機號碼'><div class='sms'> <input v-model='sms_code' type='text' class='ss'> <div @click='get_sms_code'>{{content}}</div></div><button @click='sms_login'>登錄</button><div class='register'> 沒有賬號 <span><router-link to='/register'>立即注冊</router-link></span></div> </div> </div> </div></template><script> export default { name:’login’, data:function () { return {num:1,username:’’,password:’’,remenber:’’,status:’’,content:’獲取驗證碼’,phone:’’,sms_code:’’, } }, methods:{ //手機號和短信驗證碼登錄 sms_login:function(){let _this=this;this.$axios.post(’http://127.0.0.1:8000/user/login/’,{ ’username’:_this.phone, ’password’:_this.sms_code, },{responseType:’json’}) .then(function (res) { sessionStorage.token=res.data.token; _this.$router.go(-1); }).catch(function (error) { console.log(error.response)}); }, //獲取短信驗證碼 get_sms_code:function(){let reg = /1[3-9]{2}d{8}/;if( reg.test(this.phone) ){ if(this.content == '獲取驗證碼'){ this.content=60; let _this=this; let tt=setInterval(function () { if (_this.content>=1){_this.content-- } else {_this.content=’獲取驗證碼’;clearInterval(tt) } },1000); this.$axios.get(’http://127.0.0.1:8000/user/sms?type=login&phone=’+this.phone) .then(function (res) {if(res.data.message==0){ alert(’驗證碼發(fā)送成功’)} }).catch(function (error) {console.log(error.response) }) }}else { alert(’手機號碼有誤’)} }, //用戶名和密碼登錄 login1:function () {if (this.status==1){ let _this=this; this.$axios.post(’http://127.0.0.1:8000/user/login/’,{ ’username’:_this.username, ’password’:_this.password, },{responseType:’json’}) .then(function (res) { if (res.status==200){ if (_this.remenber){sessionStorage.removeItem(’token’);localStorage.token=res.data.token; } else {localStorage.removeItem(’token’);sessionStorage.token=res.data.token } _this.$router.go(-1); } else { alert(’用戶名或密碼錯誤’) } }) .catch(function (error) { alert(error.response.data.non_field_errors[0]); console.log(error.response.data.non_field_errors); });}else { alert(’驗證碼錯誤’)} }, handlerPopup:function (captchaObj) {let _this=this;captchaObj.onSuccess(function () { var validate = captchaObj.getValidate(); _this.$axios.post('http://127.0.0.1:8000/user/yzm/',{ geetest_challenge: validate.geetest_challenge, geetest_validate: validate.geetest_validate, geetest_seccode: validate.geetest_seccode,},{ responseType:'json', }).then(function (res) { _this.status=res.data.status }).catch(function (error) { console.log(error) })});captchaObj.appendTo('#captcha'); } }, created:function () { let _this=this; this.$axios.get('http://127.0.0.1:8000/user/yzm').then(function (res) { let data=JSON.parse(res.data); initGeetest({width:’350px’,gt: data.gt,challenge: data.challenge,product: 'popup',offline: !data.success }, _this.handlerPopup);}).catch(function (error) { console.log(error) }) } }</script><style scoped>#login{ background: url(’../../assets/Login.jpg’); background-size: 100% 100%; height: 100%; position: fixed; width: 100%;}.box{ width: 500px; height: 600px; margin: 0 auto; margin-top: 200px; text-align: center;}.box img{ width: 190px; height: auto;}.box p{ margin: 0;}.sign{ font-size: 18px; color: #fff; letter-spacing: .29px; padding-top: 10px; padding-bottom: 50px;}.pass{ width: 400px; height: 460px; margin: 0 auto; background-color: white; border-radius: 4px;}.messge{ width: 400px; height: 390px; margin: 0 auto; background-color: white; border-radius: 4px;}.title2{ width: 350px; font-size: 20px; color: #9b9b9b; padding-top: 50px; border-bottom: 1px solid #e6e6e6; margin: 0 auto; margin-bottom: 20px;}.ss{ width: 350px; height: 45px; border-radius: 4px; border: 1px solid #d9d9d9; text-indent: 20px; font-size: 14px; margin-bottom: 20px;}.pass .t1{ width: 350px; margin: 0 auto; height: 20px; line-height: 20px; font-size: 12px; text-align: center; position: relative;}.t1 .right{ position: absolute; right: 0;}.remenber{ display: inline-block; position: absolute; left: 20px;}.left input{ position: absolute; left:0; width: 14px; height: 14px;}.login_btn{ width: 350px; height: 45px; background: #ffc210; border-radius: 5px; font-size: 16px; color: #fff; letter-spacing: .26px; margin-top: 30px; outline: none; border:none; cursor: pointer;}.register{ margin-top: 20px; font-size: 14px; color: #9b9b9b;}.register span{ color: #ffc210; cursor: pointer;}.cursor{ cursor: pointer;}.show{ display: inline-block; padding-bottom: 5px; border-bottom: 2px solid orange; color: #4a4a4a;}a{ text-decoration: none; color: #ffc210;}#captcha{ margin: 0 auto; height: 44px;}.sms{ position: relative; width: 350px; height: 45px; margin: 0 auto; line-height: 45px;}.sms .content{ position: absolute; top:0; right: 10px; color: orange; border-left: 1px solid orange; padding-left: 10px; cursor: pointer;}</style>

前端獲取短信驗證碼:

//獲取短信驗證碼 get_sms_code:function(){let reg = /1[3-9]{2}d{8}/;//當手機號為為真實手機號,才可以觸發(fā)獲取驗證碼if( reg.test(this.phone) ){//當頁面上顯示為‘獲取驗證碼’時,才可以觸發(fā)獲取驗證碼請求;當進入倒計時,點擊不能觸發(fā)獲取驗證碼請求 if(this.content == '獲取驗證碼'){ //成功發(fā)送獲取驗證碼請求之后開始倒計時60秒 this.content=60; let _this=this; let tt=setInterval(function () { if (_this.content>=1){_this.content-- } else {_this.content=’獲取驗證碼’;clearInterval(tt) } },1000); this.$axios.get(’http://127.0.0.1:8000/user/sms?type=login&phone=’+this.phone) .then(function (res) {if(res.data.message==0){ alert(’驗證碼發(fā)送成功’)} }).catch(function (error) {console.log(error.response) }) }}else { alert(’手機號碼有誤’)} },

前端用手機號和短信驗證碼登錄:

//獲取短信驗證碼 get_sms_code:function(){let reg = /1[3-9]{2}d{8}/;//當手機號為為真實手機號,才可以觸發(fā)獲取驗證碼if( reg.test(this.phone) ){//當頁面上顯示為‘獲取驗證碼’時,才可以觸發(fā)獲取驗證碼請求;當進入倒計時,點擊不能觸發(fā)獲取驗證碼請求 if(this.content == '獲取驗證碼'){ //成功發(fā)送獲取驗證碼請求之后開始倒計時60秒 this.content=60; let _this=this; let tt=setInterval(function () { if (_this.content>=1){_this.content-- } else {_this.content=’獲取驗證碼’;clearInterval(tt) } },1000); this.$axios.get(’http://127.0.0.1:8000/user/sms?type=login&phone=’+this.phone) .then(function (res) {if(res.data.message==0){ alert(’驗證碼發(fā)送成功’)} }).catch(function (error) {console.log(error.response) }) }}else { alert(’手機號碼有誤’)} },

到此這篇關于vue_drf實現(xiàn)短信驗證碼的文章就介紹到這了,更多相關vue_drf短信驗證碼內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品免费大片| 国产欧美在线观看免费| 国产亚洲观看| 久久激情av| 国产乱子精品一区二区在线观看| 午夜亚洲福利| 久久亚洲风情| 日韩高清一区在线| 久久99免费视频| 日韩欧美一区免费| 久久激情中文| 日韩精品一二三四| 精品久久精品| 99久久激情| 视频一区二区三区入口| 视频精品一区二区| 国产精品日本一区二区三区在线| 免费视频一区二区三区在线观看 | 日韩亚洲精品在线观看| 亚洲精品无播放器在线播放| 一区二区三区四区日韩| 国产精品乱战久久久| 国产精品久久久久蜜臀| 久久视频精品| 国产剧情一区| 亚洲欧美伊人| 日本中文字幕视频一区| 免费在线观看一区| 日韩午夜免费| 国产精品亚洲综合久久| 国产在线不卡| 国产精品一区三区在线观看| 精品亚洲a∨一区二区三区18| 久久精品99久久无色码中文字幕| 亚洲精品四区| 亚洲福利久久| 国产精品xxx| 久久午夜精品| 日韩大片在线播放| 欧美亚洲网站| 日韩中文字幕一区二区三区| 国产一区二区三区四区五区| 免费久久精品视频| 久久精品123| 成人在线超碰| 国产欧美二区| 一区二区精彩视频| 久久免费精品| 日韩精品免费一区二区夜夜嗨 | 一区二区精彩视频| 欧美色图国产精品| 色网在线免费观看| 免费一级欧美片在线观看网站| 中文字幕日韩欧美精品高清在线| 久久国产日本精品| 日韩av首页| 偷拍精品精品一区二区三区| 久久精品凹凸全集| 亚洲精品亚洲人成在线观看| 亚洲欧洲一区二区天堂久久| 午夜精品成人av| 91精品在线观看国产| 久久毛片亚洲| 亚洲精品国产嫩草在线观看 | 日韩专区欧美专区| 亚洲一区二区免费看| 欧美日韩国产一区精品一区| 尤物在线精品| 老司机精品久久| 日韩精品一区二区三区中文| 一区福利视频| 视频一区免费在线观看| 石原莉奈在线亚洲二区| 亚洲精品免费观看| 久久99久久久精品欧美| 风间由美中文字幕在线看视频国产欧美| 蜜桃久久久久| 久久中文字幕av| 亚洲精品欧美| 久久精品毛片| 999久久久国产精品| 日韩在线一二三区| 国产亚洲第一伦理第一区| 精品三级久久久| 99成人在线| 日av在线不卡| 丁香婷婷久久| 在线精品一区| 国产中文在线播放| 亚洲影视一区二区三区| 欧美1区2区3| 夜夜嗨网站十八久久| 国产精品免费大片| 国产aⅴ精品一区二区三区久久| 99久精品视频在线观看视频| 亚洲少妇在线| 精品少妇一区| 美日韩精品视频| 亚洲午夜天堂| 日本aⅴ亚洲精品中文乱码| 国产精品久久久网站| 激情综合网站| 成人亚洲一区| 国产一精品一av一免费爽爽| 欧美va天堂在线| 日本欧美国产| 国产亚洲精品美女久久久久久久久久| 国产传媒av在线| 国产美女精品视频免费播放软件| 蜜桃视频欧美| 欧美a级一区二区| 四虎精品一区二区免费| 久久精品国产大片免费观看| 成人在线超碰| 欧美黄色精品| 国产精品普通话对白| 日韩一区二区三区免费播放| 国产亚洲观看| 国产精品丝袜在线播放| 日韩欧美久久| 中文精品电影| 三级在线观看一区二区| 亚洲一区二区三区高清| 国产99久久| 欧美日韩视频一区二区三区| 激情综合网址| 99国产精品久久久久久久成人热| 久久久久久久久久久9不雅视频| 日韩欧美国产精品综合嫩v| av高清不卡| 亚洲性色av| 91精品一区国产高清在线gif | 国产精品久久观看| 久久av中文| 国产高清不卡| 亚洲成人av观看| 婷婷亚洲综合| 人人爽香蕉精品| 日韩中文字幕区一区有砖一区 | 久久高清一区| 日韩视频1区| 精品国产一区二区三区2021| 午夜影院一区| 免费在线观看成人| 日韩精品免费视频一区二区三区| 日本va欧美va精品发布| 国产极品久久久久久久久波多结野 | 国产成人精品亚洲线观看| 鲁鲁在线中文| 999视频精品| 视频一区二区不卡| 欧美一区在线观看视频| 精品免费视频| 久久国产精品99国产| 国产亚洲一区二区三区不卡| 日本欧美国产| 日韩高清欧美激情| 日韩欧美看国产| 日本国产一区| 天堂资源在线亚洲| 日本国产欧美| 久久激情网站| 日本va欧美va瓶| 日韩欧美一区二区三区在线观看 | 中文字幕高清在线播放| 亚洲综合二区| 黄色aa久久| 日韩国产欧美视频| 国产综合激情| 国产精品欧美在线观看| 一本一道久久a久久精品蜜桃| 日韩高清不卡在线| 国产一区二区三区自拍| 国产精品大片| 综合国产精品| 精品亚洲美女网站| 久久不卡日韩美女| 亚洲精一区二区三区| 国产盗摄——sm在线视频| 欧美日韩在线精品一区二区三区激情综合| 黄色在线观看www| 国产精品1区| 欧美一区二区三区久久精品| 午夜视频精品| 欧美不卡在线| 久久精品国产68国产精品亚洲| 国产精品久久久久久久久久妞妞| 国产亚洲激情| 欧美日韩国产综合网| 欧美日韩水蜜桃| 福利精品在线| 久久在线91| 国产日韩亚洲| 欧美日韩一区二区三区四区在线观看| 日韩视频一区| 亚洲毛片一区| 日韩av电影一区| 久久国产欧美日韩精品| 日韩avvvv在线播放| 亚洲一级淫片|