django 發(fā)送手機(jī)驗(yàn)證碼的示例代碼
一、流程分析:
1.用戶在項(xiàng)目前端,輸入手機(jī)號(hào),然后點(diǎn)擊【獲取驗(yàn)證碼】,將手機(jī)號(hào)發(fā)到post到后臺(tái)。
2.后臺(tái)驗(yàn)證手機(jī)號(hào)是否合法,是否已被占用,如果通過(guò)驗(yàn)證,則生成驗(yàn)證碼,并通過(guò)運(yùn)行腳本,讓短信運(yùn)營(yíng)商向該手機(jī)號(hào),發(fā)送該驗(yàn)證碼,如果沒(méi)通過(guò)驗(yàn)證,則返回錯(cuò)誤信息
3.用戶收到短信驗(yàn)證碼以后,再次將所有信息post到后臺(tái)。
4.后臺(tái)驗(yàn)證各個(gè)數(shù)據(jù),通過(guò)驗(yàn)證則完成實(shí)名制認(rèn)證,如果沒(méi)通過(guò)則返回錯(cuò)誤信息。
總結(jié),一次實(shí)名驗(yàn)證,需要兩次ajax+post
二、對(duì)接短信商:
1.在云片網(wǎng)端:
1.注冊(cè)云片網(wǎng)
后臺(tái)管理控制臺(tái)頁(yè)面:其中最重要的信息是APIKEY

2.開(kāi)發(fā)者備案、新增簽名、新增模板(模板管理)
1.云片網(wǎng)后臺(tái)的【測(cè)試】是沒(méi)有意義的,所謂的測(cè)試,就是直接給你手機(jī)發(fā)送一條短信,這算哪門子測(cè)試?
2.【簽名/模板設(shè)備】頁(yè),【簽名管理】點(diǎn)擊【新增簽名】,到這里會(huì)被提醒完善【開(kāi)發(fā)者信息】,認(rèn)證分為開(kāi)發(fā)者的【公司】和【個(gè)人】,現(xiàn)在是開(kāi)發(fā)測(cè)試階段,可以先選擇【個(gè)人】,【個(gè)人】要身份證的照片,提交照片。
3.等待認(rèn)證完成的短信通知,然后按照后臺(tái)的操作指引,在【簽名管理】頁(yè)【新增簽名】,在【模板管理】頁(yè)【新增模板】,這些都要等待云片網(wǎng)的審核,審核通過(guò)會(huì)有短信通知。

4.在云片網(wǎng)后臺(tái)設(shè)置ip白名單,將外網(wǎng)ip加入白名單

獲取本機(jī)外網(wǎng)ip最簡(jiǎn)單的方法,就是百度ip

2.在django項(xiàng)目中寫發(fā)送短信的腳本
在 項(xiàng)目目錄下 新建utils目錄 新建yunpian.py
import requests
class YunPian(object):
def __init__(self,api_key):
self.api_key=api_key
self.single_send_url='https://sms.yunpian.com/v2/sms/single_send.json'
def send_sms(self,code,mobile):
parmas={
'apikey':self.api_key,
'mobile':mobile,
'text':'【**網(wǎng)】您的驗(yàn)證碼是[code]。如非本人操作,請(qǐng)忽略本短信'.format(code=code)
}
#text必須要跟云片后臺(tái)的模板內(nèi)容 保持一致,不然發(fā)送不出去!
r=requests.post(self.single_send_url,data=parmas)
print(r)
if __name__=='__main__':
yun_pian=YunPian('***************(你的apikey)')
yun_pian.send_sms('***(驗(yàn)證碼)','*******(手機(jī)號(hào))')
三、在項(xiàng)目中寫發(fā)送手機(jī)驗(yàn)證碼相關(guān)代碼:
1.前端相關(guān)代碼:
<!--發(fā)送按鈕倒計(jì)時(shí)代碼-->
<script type="text/javascript">
var countdown=60;
function settime(obj) {
if (countdown == 0) {
obj.removeAttribute("disabled");
obj.value="免費(fèi)獲取驗(yàn)證碼";
countdown = 60;
return;
} else {
obj.setAttribute("disabled", true);
obj.value="重新發(fā)送(" + countdown + ")";
countdown--;
}
setTimeout(function() {
settime(obj) }
,1000)
}
</script>
<!--手機(jī)號(hào)碼輸入框代碼-->
<div class="form-group">
<label for="mobile" class="col-lg-2 col-sm-2 control-label">手機(jī)號(hào)碼:</label>
<div class="col-lg-10">
<div class="input-group m-bot15">
<input type="text" class="form-control" id="mobile" name="mobile" placeholder="手機(jī)號(hào)碼">
<span class="input-group-btn">
<input type="button" id="forcode" onclick="settime(this)" value="免費(fèi)獲取驗(yàn)證碼" class="btn btn-success">
</span>
</div>
<p class="help-block">請(qǐng)?zhí)顚懡壎ㄊ謾C(jī)號(hào)</p>
</div>
</div>
<!--向后臺(tái)通過(guò)ajax發(fā)送手機(jī)號(hào)碼數(shù)據(jù)-->
<script>
$('#forcode').click(function () {
$.ajax({
cache:false,
type:"POST",
url:"{% url 'users:forcode' %}",
data:{
csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val(),
mobile:$("#mobile").val()
},
async:true,
success:function (data) {
alert(data)
}
})
})
</script>
效果圖:

2.在users/views.py中寫發(fā)送驗(yàn)證碼相關(guān)代碼:
import re
import random
from xyw.settings import APIKEY
from .models import VerifyCode
class ForCodeView(View):
"""獲取手機(jī)驗(yàn)證碼"""
def post(self,request):
mobile=request.POST.get('mobile','')
if mobile:
#驗(yàn)證是否為有效手機(jī)號(hào)
mobile_pat=re.compile('^(13\d|14[5|7]|15\d|166|17\d|18\d)\d{8}$')
res=re.search(mobile_pat,mobile)
if res:
#生成手機(jī)驗(yàn)證碼
code=VerifyCode()
code.mobile=mobile
c=random.randint(1000,9999)
code.code=str(c)
code.save()
code=VerifyCode.objects.filter(mobile=mobile).first().code
yunpian=YunPian(APIKEY)
sms_status=yunpian.send_sms(code=code,mobile=mobile)
msg=sms_status.msg
return HttpResponse(msg)
else:
msg='請(qǐng)輸入有效手機(jī)號(hào)碼!'
return HttpResponse(msg)
else:
msg='手機(jī)號(hào)不能為空!'
return HttpResponse(msg)
3.在users/urls.py中:
from .views import ForCodeView
......
urlpatterns = [
......
path('forcode/',ForCodeView.as_view(),name='forcode'),
]
4.在settings.py中增加代碼:
#云片網(wǎng)apikey APIKEY=‘你云片網(wǎng)的apikey'
至此,完成了發(fā)送手機(jī)驗(yàn)證碼功能。
其實(shí)也有可以優(yōu)化的地方:
1.雖然前端設(shè)置了60秒才可以重新發(fā)送,但是這個(gè)驗(yàn)證在后端也應(yīng)該有,以防被有心人利用。
2.沒(méi)有驗(yàn)證手機(jī)號(hào)碼是否已經(jīng)被發(fā)送過(guò)驗(yàn)證碼
3.驗(yàn)證碼沒(méi)有生命周期,應(yīng)該各一段時(shí)間讓驗(yàn)證碼失效
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
PyTorch 導(dǎo)數(shù)應(yīng)用的使用教程
這篇文章主要介紹了PyTorch 導(dǎo)數(shù)應(yīng)用的使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
用python寫個(gè)自動(dòng)SSH登錄遠(yuǎn)程服務(wù)器的小工具(實(shí)例)
下面小編就為大家?guī)?lái)一篇用python寫個(gè)自動(dòng)SSH登錄遠(yuǎn)程服務(wù)器的小工具(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
使用Python通過(guò)win32 COM實(shí)現(xiàn)Word文檔的寫入與保存方法
今天小編就為大家分享一篇使用Python通過(guò)win32 COM實(shí)現(xiàn)Word文檔的寫入與保存方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
python EasyOCR庫(kù)實(shí)例用法介紹
在本篇文章里小編給大家整理的是一篇關(guān)于python EasyOCR庫(kù)實(shí)例用法介紹,有需要的朋友們可以跟著學(xué)習(xí)下。2021-07-07
將string類型的數(shù)據(jù)類型轉(zhuǎn)換為spark rdd時(shí)報(bào)錯(cuò)的解決方法
今天小編就為大家分享一篇關(guān)于將string類型的數(shù)據(jù)類型轉(zhuǎn)換為spark rdd時(shí)報(bào)錯(cuò)的解決方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Python使用Dash開(kāi)發(fā)網(wǎng)頁(yè)應(yīng)用的方法詳解
本文主要是通過(guò)Dash的Checklist組件,簡(jiǎn)單介紹使用Dash開(kāi)發(fā)的Web應(yīng)用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09
python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5滾動(dòng)條控件QScrollBar詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5滾動(dòng)條控件QScrollBar詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03
對(duì)django xadmin自定義菜單的實(shí)例詳解
今天小編就為大家分享一篇對(duì)django xadmin自定義菜單的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01

