热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

django项目中使用手机号登录

本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数function.py文件se













本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id


项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数


function.py文件



import random
import re
# 随机数
def range_num(num):
# 定义一个种子,从这里面随机拿出一个值,可以是字母
seeds = "1234567890"
# 定义一个空列表,每次循环,将拿到的值,加入列表
random_num = []
# choice函数:每次从seeds拿一个值,加入列表
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
# 发送短信
def request2(mobile,num, m="GET"):
appkey
= \'6bba3e7dffa71b79483002e1d92f4d00\'
url
= "http://v.juhe.cn/sms/send"
params
= {
"mobile": mobile, # 接收短信的手机号码
"tpl_id": "167106", # 短信模板ID,请参考个人中心短信模板设置
"tpl_value": "#code#=%s"%num,
# 变量名和变量值对。如果你的变量名或者变量值中带有#&=中的任意一个特殊符号,请先分别进行urlencode编码后再传递,详细说明>
"key": appkey, # 应用APPKEY(应用详细页查询)
"dtype": "", # 返回数据的格式,xml或json,默认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转字典
if res:
error_code
= res["error_code"]
if error_code == 0:
# 成功请求
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"


路由



# 手机验证码登录
path(\'loginTel/\', login.loginTel,name=\'loginTel\'),


方法



from blog.utils import sendMsg  
from blog.utils import function # 引入自定义的验证码

# 手机验证登陆
def loginTel(request):
res
= {\'status\': None, \'info\': None}
# 点击发送短信执行以下程序
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\']=\'发送成功%s\'%range_num
res[\'info\'] = \'发送成功\'
print(res)
return HttpResponse(json.dumps(res)) # 把这个结果告诉给前台,ajax
else:
res[
\'status\'] = 0
res[
\'info\'] = \'发送失败\'
return HttpResponse(json.dumps(res)) # 把这个结果告诉给前台,ajax

# 点击登录按钮执行以下程序:
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\'] = \'短信验证码不正确\'
return HttpResponse(json.dumps(res)) # 把这个结果告诉给前台,ajax
else:
res[
\'status\'] = 0
res[
\'info\'] = \'短信验证码不存在\'
return HttpResponse(json.dumps(res)) # 把这个结果告诉给前台,ajax

# 写判断手机号是否在会员表中
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)) # 把这个结果告诉给前台,ajax
return render(request, \'blog/loginTel.html\', locals())


前端登录的表单



{#手机登陆的表单#}
"post">

"text" name="user_tel" placeholder="请输入手机号">

"text" name="validcode" placeholder="请输入短信验证码">


class="am-g">
"yanzhengma" type="button" value="获取验证码"/>
"nowYanzhengma" color: rgba(128, 0, 0, 1)">"display: none;" type="button" value=""/>
class="submit " type="button" id="btn_login" value="登录"/>




{
#手机登陆的表单#}


前端登录的jquery



{#手机号登陆的jquery#}
//校验用户名
$(
"#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(
"登录成功!即将跳转至首页~");
location.href
= "{% url \'index\' %}";
}
else {

layer.msg(data[
\'info\']);
}

return false;
},
"json");
});
//点击获取验证码按钮
$(
"#yanzhengma").click(function () {
getSmsCode();
});

//获取短信验证码
function getSmsCode() {

var user_tel
= $.trim($("input[name=\'user_tel\']").val());//得到页面里的手机号码
var reguser
= /^[1][3-8]\d{9}$/;
if (user_tel == "") {
layer.msg(
"请填写手机号码");
return false;
}
if (!reguser.test(user_tel)) {
layer.msg(
"手机号码格式不正确");
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;

//开启定时器
function timeout() {
interval
= setInterval(run, 1000);
}

function run() {
if (sec >= 1) {
sec
--;
$(
"#yanzhengma").hide();
$(
"#nowYanzhengma").show();
$(
"#nowYanzhengma").val("倒计时(" + sec + ")s");

}
else {
$(
"#yanzhengma").off(\'click\');
$(
\'#yanzhengma\').on("click", function (event) {
getSmsCode();
});
$(
"#yanzhengma").show();
$(
"#nowYanzhengma").hide();
clearInterval(interval);
//关闭定时器
sec
= 60;
}

}

{
#手机号登陆的jquery结束#}


前端效果



done。


 














推荐阅读
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文介绍如何使用 Python 提取和替换 .docx 文件中的图片。.docx 文件本质上是压缩文件,通过解压可以访问其中的图片资源。此外,我们还将探讨使用第三方库 docx 的方法来简化这一过程。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍了如何在Python中使用join()方法将列表中的元素连接成一个字符串。join()方法允许用户指定分隔符,从而灵活地生成所需格式的字符串。此外,我们还将探讨一些实际应用中的注意事项和技巧。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
author-avatar
棋牌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有