django項(xiàng)目中使用手機(jī)號(hào)登錄的實(shí)例代碼
本文使用聚合數(shù)據(jù)的短信接口,需要先獲取到申請(qǐng)接口的appkey和模板id
項(xiàng)目目錄下創(chuàng)建ubtils文件夾,定義返回隨機(jī)驗(yàn)證碼和調(diào)取短信接口的函數(shù)
function.py文件
import random
import re
# 隨機(jī)數(shù)
def range_num(num):
# 定義一個(gè)種子,從這里面隨機(jī)拿出一個(gè)值,可以是字母
seeds = "1234567890"
# 定義一個(gè)空列表,每次循環(huán),將拿到的值,加入列表
random_num = []
# choice函數(shù):每次從seeds拿一個(gè)值,加入列表
for i in range(num):
random_num.append(random.choice(seeds))
# 將列表里的值,變成四位字符串
return "" . join(random_num)#5454
sendMsg.py文件
import json, urllib
from urllib.parse import urlencode
# 發(fā)送短信
def request2(mobile,num, m="GET"):
appkey = '6bba3e7dffa71b79483002e1d92f4d00'
url = "http://v.juhe.cn/sms/send"
params = {
"mobile": mobile, # 接收短信的手機(jī)號(hào)碼
"tpl_id": "167106", # 短信模板ID,請(qǐng)參考個(gè)人中心短信模板設(shè)置
"tpl_value": "#code#=%s"%num,
# 變量名和變量值對(duì)。如果你的變量名或者變量值中帶有#&=中的任意一個(gè)特殊符號(hào),請(qǐng)先分別進(jìn)行urlencode編碼后再傳遞,<a href="http://www.juhe.cn/news/index/id/50" target="_blank">詳細(xì)說明></a>
"key": appkey, # 應(yīng)用APPKEY(應(yīng)用詳細(xì)頁查詢)
"dtype": "", # 返回?cái)?shù)據(jù)的格式,xml或json,默認(rèn)json
}
params = urlencode(params)#mobile=15038062130&tpl_id=166467&tpl_value=%23code%23%3d431515&key=dabf6ecaebfa9554395dad7dcc6be7c8
if m == "GET":
f = urllib.request.urlopen("%s?%s" % (url, params))
else:
f = urllib.request.urlopen(url, params)
content = f.read()#{"reason":"操作成功","result":{"sid":"201906200911371223162juhe6hy","fee":1,"count":1},"error_code":0}
res = json.loads(content)#json轉(zhuǎn)字典
if res:
error_code = res["error_code"]
if error_code == 0:
# 成功請(qǐng)求
return 'ok'
# print(res["result"])
else:
return "%s:%s" % (res["error_code"], res["reason"])
# print("%s:%s" % (res["error_code"], res["reason"]))
else:
return "request api error"
路由
# 手機(jī)驗(yàn)證碼登錄
path('loginTel/', login.loginTel,name='loginTel'),
方法
from blog.utils import sendMsg
from blog.utils import function # 引入自定義的驗(yàn)證碼
# 手機(jī)驗(yàn)證登陸
def loginTel(request):
res = {'status': None, 'info': None}
# 點(diǎn)擊發(fā)送短信執(zhí)行以下程序
if request.POST.get('sendSms') == '1':
tel = request.POST.get('user_tel')
print(tel)
range_num = function.range_num(4); # 5454
request.session['validcode'] = range_num
result = sendMsg.request2(tel, range_num, "GET")
# result='ok'
if result == 'ok':
res['status'] = 1
# res['info']='發(fā)送成功%s'%range_num
res['info'] = '發(fā)送成功'
print(res)
return HttpResponse(json.dumps(res)) # 把這個(gè)結(jié)果告訴給前臺(tái),ajax
else:
res['status'] = 0
res['info'] = '發(fā)送失敗'
return HttpResponse(json.dumps(res)) # 把這個(gè)結(jié)果告訴給前臺(tái),ajax
# 點(diǎn)擊登錄按鈕執(zhí)行以下程序:
if request.POST.get('dosubmit') == '1':
validcode_form = request.POST.get('validcode')
validcode_session = request.session.get('validcode') # 獲取session
if validcode_form:
if validcode_form != validcode_session:
res['status'] = 0
res['info'] = '短信驗(yàn)證碼不正確'
return HttpResponse(json.dumps(res)) # 把這個(gè)結(jié)果告訴給前臺(tái),ajax
else:
res['status'] = 0
res['info'] = '短信驗(yàn)證碼不存在'
return HttpResponse(json.dumps(res)) # 把這個(gè)結(jié)果告訴給前臺(tái),ajax
# 寫判斷手機(jī)號(hào)是否在會(huì)員表中
member_obj = Member.objects.filter(member_tel=request.POST.get('user_tel')).first()
if member_obj:
request.session['member_id'] = member_obj.member_id
request.session['member_name'] = member_obj.member_name
res['status'] = 1
res['info'] = '登錄成功'
return HttpResponse(json.dumps(res)) # 把這個(gè)結(jié)果告訴給前臺(tái),ajax
return render(request, 'blog/loginTel.html', locals())
前端登錄的表單
{#手機(jī)登陸的表單#}
<form method="post">
<input type="text" name="user_tel" placeholder="請(qǐng)輸入手機(jī)號(hào)">
<input type="text" name="validcode" placeholder="請(qǐng)輸入短信驗(yàn)證碼">
<div class="am-g">
<input id="yanzhengma" type="button" value="獲取驗(yàn)證碼"/>
<input id="nowYanzhengma" style="display: none;" type="button" value=""/>
<input class="submit " type="button" id="btn_login" value="登錄"/>
</div>
</form>
{#手機(jī)登陸的表單#}
前端登錄的jquery
{#手機(jī)號(hào)登陸的jquery#}
//校驗(yàn)用戶名
$("#btn_login").click(function () {
var user_tel = $.trim($("input[name='user_tel']").val());
var validcode = $.trim($("input[name='validcode']").val());
$.post("/blog/loginTel/", {
"user_tel": user_tel,
"validcode": validcode,
"dosubmit": 1,
"csrfmiddlewaretoken": "{{ csrf_token }}"
}, function (data) {
if (data['status'] == 1) {
layer.msg("登錄成功!即將跳轉(zhuǎn)至首頁~");
location.href = "{% url 'index' %}";
} else {
layer.msg(data['info']);
}
return false;
}, "json");
});
//點(diǎn)擊獲取驗(yàn)證碼按鈕
$("#yanzhengma").click(function () {
getSmsCode();
});
//獲取短信驗(yàn)證碼
function getSmsCode() {
var user_tel = $.trim($("input[name='user_tel']").val());//得到頁面里的手機(jī)號(hào)碼
var reguser = /^[1][3-8]\d{9}$/;
if (user_tel == "") {
layer.msg("請(qǐng)?zhí)顚懯謾C(jī)號(hào)碼");
return false;
}
if (!reguser.test(user_tel)) {
layer.msg("手機(jī)號(hào)碼格式不正確");
return false;
}
{#$("#yanzhengma").off('click');#}
$.post("/blog/loginTel/", {
"user_tel": user_tel,
'sendSms': 1,
"csrfmiddlewaretoken": "{{ csrf_token }}"
}, function (data) {
if (data['status'] == 1) {
timeout();
layer.msg(data['info']);
} else {
layer.msg(data['content']);
}
}, 'json');
}
var sec = 60;
var interval = null;
//開啟定時(shí)器
function timeout() {
interval = setInterval(run, 1000);
}
function run() {
if (sec >= 1) {
sec--;
$("#yanzhengma").hide();
$("#nowYanzhengma").show();
$("#nowYanzhengma").val("倒計(jì)時(shí)(" + sec + ")s");
} else {
$("#yanzhengma").off('click');
$('#yanzhengma').on("click", function (event) {
getSmsCode();
});
$("#yanzhengma").show();
$("#nowYanzhengma").hide();
clearInterval(interval);//關(guān)閉定時(shí)器
sec = 60;
}
}
{#手機(jī)號(hào)登陸的jquery結(jié)束#}
前端效果

總結(jié)
以上所述是小編給大家介紹的django項(xiàng)目中使用手機(jī)號(hào)登錄的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Python測(cè)試網(wǎng)絡(luò)連通性示例【基于ping】
這篇文章主要介紹了Python測(cè)試網(wǎng)絡(luò)連通性,結(jié)合實(shí)例形式分析了Python通過發(fā)送ping請(qǐng)求測(cè)試網(wǎng)絡(luò)連通性相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
python tqdm實(shí)現(xiàn)進(jìn)度條的示例代碼
這篇文章主要介紹了python tqdm實(shí)現(xiàn)進(jìn)度條的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Python與C++中梯度方向直方圖的實(shí)現(xiàn)
在學(xué)習(xí)HOG特征的時(shí)候,發(fā)現(xiàn)一片英文文章講得淺顯易懂。因此翻譯在這里學(xué)習(xí),感興趣的朋友快來看看吧2022-03-03
python3 字符串/列表/元組(str/list/tuple)相互轉(zhuǎn)換方法及join()函數(shù)的使用
這篇文章主要介紹了python3 字符串/列表/元組(str/list/tuple)相互轉(zhuǎn)換方法及join()函數(shù)的使用 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
基于python的前后端分離的模擬實(shí)現(xiàn)
前后端分離核心是UI界面展示層(View)和數(shù)據(jù)處理層(Model)通過控制層(Controller)進(jìn)行解耦合,在MVC設(shè)計(jì)模式中,前端主要負(fù)責(zé)數(shù)據(jù)展示和用戶交互(View),后端處理業(yè)務(wù)邏輯和數(shù)據(jù)存儲(chǔ)(Model),通過API接口進(jìn)行通信,提高了開發(fā)效率,便于前后端分工合作,有利于代碼的維護(hù)和迭代2024-10-10
Pandas數(shù)據(jù)分析固定時(shí)間點(diǎn)和時(shí)間差
這篇文章主要介紹了Pandas數(shù)據(jù)分析固定時(shí)間點(diǎn)和時(shí)間差,文章未日澳主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
Python使用grequests(gevent+requests)并發(fā)發(fā)送請(qǐng)求過程解析
這篇文章主要介紹了Python使用grequests并發(fā)發(fā)送請(qǐng)求過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Python命令行參數(shù)解析模塊getopt使用實(shí)例
這篇文章主要介紹了Python命令行參數(shù)解析模塊getopt使用實(shí)例,本文講解了使用語法格式、短選項(xiàng)參數(shù)實(shí)例、長選項(xiàng)參數(shù)實(shí)例等內(nèi)容,需要的朋友可以參考下2015-04-04

