Django短信验证码
Django短信验证码
在阿里云中购买短信服务https://www.aliyun.com/
将短信验证码保存到redis中, 存取速度快,减轻mysql数据库服务器压力。
redis中的键可以设置过期时间, 短信验证码可以设置2分钟过期时间,过期自动销毁。
获取redis连接
# 导入redis连接方法
from django_redis import get_redis_connection
# 使用默认配置连接到redis
cnn = get_redis_connection('default')
# 使用连接上的方法操作redis
cnn.hset('对象名','属性' ,'值')
使用redis的命令
查看手册http://doc.redisfans.com/
封装两个方法:
发送手机短信的方法
# 发送手机验证码
def send_phone_code(request):
""" :param request: HttpRequest 请求对象 :param phone: 手机号码 :return: 返回结果 """
try:
# 获取手机号码
phone = request.GET.get('phone')
# 验证手机号是否正确
phone_re = re.compile('^1[3-9]\d{9}$')
res = re.search(phone_re, phone)
if res:
# 生成随机验证码
code = "".join([str(random.randint(0, 9)) for _ in range(4)])
print(code)
print("===========================")
# 保存到redis中 ,等你验证的时候使用
r = get_redis_connection('default')
r.set(tel, code)
# 设置过期时间 redis
r.expire(tel, 120)
# 发送短信验证码
__business_id = uuid.uuid1()
# 信息
params = "{\"code\":\"%s\"}" % code
rs = send_sms(__business_id, phone, "模板名称", "SMS_141905190", params)
print(rs.decode('utf-8'))
return { 'ok': 1, 'code': 200}
else:
return { 'ok': 0, 'code': 500, 'msg': '手机号码格式错误!'}
except:
return { 'ok':0,'code':500,'msg':'短信验证码发送失败'}
发送的方法
# 发送短信
def send_sms(business_id, phone_numbers, sign_name, template_code, template_param=None):
# 注意:不要更改
REGION = "cn-hangzhou"
PRODUCT_NAME = "Dysmsapi"
DOMAIN = "dysmsapi.aliyuncs.com"
# acs_client = AcsClient(const.ACCESS_KEY_ID, const.ACCESS_KEY_SECRET, REGION)
acs_client = AcsClient(settings.ACCESSKEYID, settings.ACCESSKEYSECRET, REGION)
region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)
smsRequest = SendSmsRequest.SendSmsRequest()
# 申请的短信模板编码,必填
smsRequest.set_TemplateCode(template_code)
# 短信模板变量参数
if template_param is not None:
smsRequest.set_TemplateParam(template_param)
# 设置业务请求流水号,必填。
smsRequest.set_OutId(business_id)
# 短信签名
smsRequest.set_SignName(sign_name)
# 数据提交方式
# smsRequest.set_method(MT.POST)
# 数据提交格式
# smsRequest.set_accept_format(FT.JSON)
# 短信发送的号码列表,必填。
smsRequest.set_PhoneNumbers(phone_numbers)
# 调用短信发送接口,返回json
smsResponse = acs_client.do_action_with_exception(smsRequest)
# TODO 业务处理
return smsResponse return smsResponse
创建视图函数并绑定路由
# 短信发送 视图函数
def sendMsg(request):
return JsonResponse(send_phone_code(request))
# 8. 路由绑定
urlpatterns = [
url(r'^sendMsg/$', sendMsg, name='sendMsg'), # 发短信
]
ajax 点击按钮 js 代码
{ % block footer_js %}
<script>
$(function () {
// 验证码按钮上绑定点击事件
$(".yzm-hq").on('click', function () {
// 由于this会在很多匿名函数中使用,先将其保存在一个变量中
// 因为其他匿名函数中有自己的this,会和点击事件的this冲突
var that = this;
// 获取手机号码
phone = $("input[name='phone']").val();
// 通过ajax发送get请求
$.get('{% url "sp_user:sendMsg" %}', { 'phone': phone}, function (data) {
//判断是否请求成功
if (data.ok == 1) {
// 设定 60 秒后可以重新发送验证码
var time = 60;
// 立马 将按钮禁用 防止重复点击提交
$(that).attr('disabled', true);
// 颜色设置为 灰色
$(that).css({ 'backgroundColor': "gray"});
// 将按钮提示文字改变
showMsg(that, time);
// 设置周期性执行, 周期性改变显示文字内容
var timer = window.setInterval(function () {
// 时间减少
--time;
// 显示文字
showMsg(that, time);
// 判断是否到期
if (time == 0) {
// 到期后清除定时器
window.clearInterval(timer);
// 启用按钮
$(that).attr('disabled', false);
// 改变颜色和文字内容
$(that).css({ 'backgroundColor': "#76bb2a"});
$(that).val("获取验证码");
}
}, 1000)
} else {
alert(data.msg);
}
})
});
//改变按钮 倒计时显示内容
function showMsg(obj, time) {
var msg = time + "秒后重新发送!";
$(obj).val(msg);
}
})
</script>
{ % endblock %}
在RegisterView注册视图中验证提交的验证码核心代码
form表单中的核心验证验证码的代码
# 验证码字段添加
verify_code = forms.CharField(error_messages={ "required": "请填写验证"})
# 单独使用一个方法校验 验证码
def clean_verify_code(self):
# 验证验证码是否填写正确
# 获取redis中的验证码
r = get_redis_connection()
tel = self.cleaned_data.get('phone')
s_verify_code = r.get(tel)
if not s_verify_code:
raise forms.ValidationError("验证码已经过期")
# 表单传入的验证码
verify_code = self.cleaned_data.get('verify_code')
# sid_verify_code = self.data.get('sid_verify_code')
if int(verify_code) != int(s_verify_code):
raise forms.ValidationError("验证码输入有误")
return verify_code
还没有评论,来说两句吧...