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ì)頁(yè)查詢) "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)至首頁(yè)~"); 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());//得到頁(yè)面里的手機(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 GUI庫(kù)圖形界面開發(fā)之PyQt5簡(jiǎn)單繪圖板實(shí)例與代碼分析
這篇文章主要介紹了python GUI庫(kù)圖形界面開發(fā)之PyQt5簡(jiǎn)單繪圖板實(shí)例與代碼分析,需要的朋友可以參考下2020-03-03Python爬蟲requests模塊之URL地址中的參數(shù)解讀
這篇文章主要介紹了Python爬蟲requests模塊之URL地址中的參數(shù)解讀,在你拿到數(shù)據(jù)所在的url地址之后,發(fā)送網(wǎng)絡(luò)請(qǐng)求時(shí),請(qǐng)求的url中包含兩種地址參數(shù):查詢參數(shù)和請(qǐng)求參數(shù),需要的朋友可以參考下2023-08-08Python程序中的觀察者模式結(jié)構(gòu)編寫示例
觀察者模式是最常用的設(shè)計(jì)模式之一,旨在觀察目標(biāo)和觀察者之間建立一個(gè)抽象的耦合,減少對(duì)象之間的耦合,這里我們就來看一下Python程序中的觀察者模式結(jié)構(gòu)編寫示例2016-05-05Python中基礎(chǔ)數(shù)據(jù)類型 set集合知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家總結(jié)了一篇關(guān)于Python中基礎(chǔ)數(shù)據(jù)類型 set集合知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2021-08-08python 列表,數(shù)組,矩陣兩兩轉(zhuǎn)換tolist()的實(shí)例
下面小編就為大家分享一篇python 列表,數(shù)組,矩陣兩兩轉(zhuǎn)換tolist()的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04python使用opencv在Windows下調(diào)用攝像頭實(shí)現(xiàn)解析
這篇文章主要介紹了python使用opencv在Windows下調(diào)用攝像頭實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11python中g(shù)etaddrinfo()基本用法實(shí)例分析
這篇文章主要介紹了python中g(shù)etaddrinfo()基本用法,實(shí)例分析了Python中使用getaddrinfo方法進(jìn)行IP地址解析的基本技巧,需要的朋友可以參考下2015-06-06解決python寫的windows服務(wù)不能啟動(dòng)的問題
使用py2exe生成windows服務(wù)在win7下可以正常運(yùn)行,但是到了xp下面可以安裝,但是無(wú)法啟動(dòng)2014-04-04