django项目中使用手机号登录
本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id
项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数
function.py文件
import random
import re
# 随机数
def range_num(num):
# 定义一个种子,从这里面随机拿出一个值,可以是字母
seeds = ""
# 定义一个空列表,每次循环,将拿到的值,加入列表
random_num = []
# choice函数:每次从seeds拿一个值,加入列表
for i in range(num):
random_num.append(random.choice(seeds))
# 将列表里的值,变成四位字符串
return "" . join(random_num)#
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": "", # 短信模板ID,请参考个人中心短信模板设置
"tpl_value": "#code#=%s"%num,
# 变量名和变量值对。如果你的变量名或者变量值中带有#&=中的任意一个特殊符号,请先分别进行urlencode编码后再传递,<a href="http://www.juhe.cn/news/index/id/50" target="_blank">详细说明></a>
"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') == '': tel = request.POST.get('user_tel')
print(tel)
range_num = function.range_num(4); # 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') == '':
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())
前端登录的表单
{#手机登陆的表单#}
<form method="post">
<input type="text" name="user_tel" placeholder="请输入手机号">
<input type="text" name="validcode" placeholder="请输入短信验证码">
<div class="am-g">
<input id="yanzhengma" type="button" value="获取验证码"/>
<input id="nowYanzhengma" style="display: none;" type="button" value=""/>
<input class="submit " type="button" id="btn_login" value="登录"/>
</div>
</form>
{#手机登陆的表单#}
前端登录的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。
django项目中使用手机号登录的更多相关文章
- Django项目中集成第三方登录时出现的错误
原以为是被反爬 没想到 总结:这里的http应该是https协议,以后要更加小心 了,不能犯这种低级错误
- Django项目中使用qq第三方登录。
使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY 1,建路由 # qq登录 path('loginQq/',qq.loginQq,name=' ...
- 【技术博客】JWT的认证机制Django项目中应用
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...
- 转:C4项目中验证用户登录一个特性就搞定
转:C4项目中验证用户登录一个特性就搞定 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用 ...
- [翻译]在Django项目中添加谷歌统计(Google Analytics)
原文:<Google Analytics tracking code into Django projects, the easy way> 对我来说,制作一个可扩展的Django应用随时 ...
- Django项目中使用Redis
Django项目中使用Redis DjangoRedis 1 redis Redis 是一个 key-value 存储系统,常用于缓存的存储.django-redis 基于 BSD 许可, 是一个使 ...
- 擦他丫的,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了!
擦 ,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了! 问题在于我使用的谷歌浏览器,默认使用了缓存,导致每次访问同一个url时,都返回的是缓存里面的东西.通过谷歌 ...
- django 项目中使用多数据库 multiple databases
假如在一个django项目中使用到了不只一个数据库, 其实这在大一点的工程中很常见,比如主从库 那么会涉及到如下一些东西 1, 定义 在settings中的DATABASE中定义会使用到的数据,比如除 ...
- django 项目中的 favicon.ico 处理
django 项目中的 favicon.ico 处理 (django == 2.0.6) 1. 引入模块: from django.views.generic.base import Redirec ...
随机推荐
- 使用命令行操作vmware esxi -- powershell
之前提到过用linux命令行的方法操作vmware,这节我们来使用powershell的方式来操作.在操作之前需要下载安装一款命令行工具PowerCLI,本节只列出一些常用命令. 个人认为powerc ...
- navcat excel数据导入mysql的方法
navcat excel数据导入mysql的方法 先navcat导出 xls格式 然后把数据复制到往这个xls里 (按照这个xls格式) 然后导入mysql就行了 如果导入的过程无法识别excel里的 ...
- 1.4 Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)
当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷 ...
- phpmyadmin 显示被隐藏的表
点击后,会把这个表隐藏掉.有时候误点会莫名其妙. 点击数据库上的眼睛,能够显示被隐藏的表.
- js中常见的字符串方法(3)
match() match()方法只接受一个参数,要么是一个正则表达式,要么是一个 RegExp 对象. 调用这个方法本质上与调用RegExp的exec()方法相同, var text = " ...
- Python使用队列实现Josephus问题
Josephus问题,在这个古老的问题中,N个深陷绝境的人一致同意通过以下方式减少生存的人数.他们围坐一圈(位置记为0~N-1)并从第一个人报数,报到M的人会被杀死, 知道最后一个人留下来.传说中Jo ...
- 回文树/回文自动机(PAM)学习笔记
回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的 ...
- 一个Java程序员该有的良好品质
一.前言 多年来,在IT领域,从一个普通的程序员到一个技术主管,再到一个技术经理,再到一个技术主管,他们践踏了许多坑,劳累了许多课程,还背着许多罐子.在提高他们的技术和管理能力的同时,他们一直在考虑如 ...
- .Net Core WebApi(2)—Swagger
上一个版本的入门Swagger提示不够完整,这章着重完善和优化 Swagger用于将我们编写的接口自动生成规范化的文档,便于进行测试和对接 一.创建Swagger 1.1 Nuget 安装 ...
- MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...