Django短信验证码

╰+哭是因爲堅強的太久メ 2021-09-17 16:14 558阅读 0赞

Django短信验证码

在阿里云中购买短信服务https://www.aliyun.com/

将短信验证码保存到redis中, 存取速度快,减轻mysql数据库服务器压力。

redis中的键可以设置过期时间, 短信验证码可以设置2分钟过期时间,过期自动销毁。

获取redis连接

  1. # 导入redis连接方法
  2. from django_redis import get_redis_connection
  3. # 使用默认配置连接到redis
  4. cnn = get_redis_connection('default')
  5. # 使用连接上的方法操作redis
  6. cnn.hset('对象名''属性' '值')

使用redis的命令

查看手册http://doc.redisfans.com/

封装两个方法:

发送手机短信的方法

  1. # 发送手机验证码
  2. def send_phone_code(request):
  3. """ :param request: HttpRequest 请求对象 :param phone: 手机号码 :return: 返回结果 """
  4. try:
  5. # 获取手机号码
  6. phone = request.GET.get('phone')
  7. # 验证手机号是否正确
  8. phone_re = re.compile('^1[3-9]\d{9}$')
  9. res = re.search(phone_re, phone)
  10. if res:
  11. # 生成随机验证码
  12. code = "".join([str(random.randint(0, 9)) for _ in range(4)])
  13. print(code)
  14. print("===========================")
  15. # 保存到redis中 ,等你验证的时候使用
  16. r = get_redis_connection('default')
  17. r.set(tel, code)
  18. # 设置过期时间 redis
  19. r.expire(tel, 120)
  20. # 发送短信验证码
  21. __business_id = uuid.uuid1()
  22. # 信息
  23. params = "{\"code\":\"%s\"}" % code
  24. rs = send_sms(__business_id, phone, "模板名称", "SMS_141905190", params)
  25. print(rs.decode('utf-8'))
  26. return { 'ok': 1, 'code': 200}
  27. else:
  28. return { 'ok': 0, 'code': 500, 'msg': '手机号码格式错误!'}
  29. except:
  30. return { 'ok':0,'code':500,'msg':'短信验证码发送失败'}

发送的方法

  1. # 发送短信
  2. def send_sms(business_id, phone_numbers, sign_name, template_code, template_param=None):
  3. # 注意:不要更改
  4. REGION = "cn-hangzhou"
  5. PRODUCT_NAME = "Dysmsapi"
  6. DOMAIN = "dysmsapi.aliyuncs.com"
  7. # acs_client = AcsClient(const.ACCESS_KEY_ID, const.ACCESS_KEY_SECRET, REGION)
  8. acs_client = AcsClient(settings.ACCESSKEYID, settings.ACCESSKEYSECRET, REGION)
  9. region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)
  10. smsRequest = SendSmsRequest.SendSmsRequest()
  11. # 申请的短信模板编码,必填
  12. smsRequest.set_TemplateCode(template_code)
  13. # 短信模板变量参数
  14. if template_param is not None:
  15. smsRequest.set_TemplateParam(template_param)
  16. # 设置业务请求流水号,必填。
  17. smsRequest.set_OutId(business_id)
  18. # 短信签名
  19. smsRequest.set_SignName(sign_name)
  20. # 数据提交方式
  21. # smsRequest.set_method(MT.POST)
  22. # 数据提交格式
  23. # smsRequest.set_accept_format(FT.JSON)
  24. # 短信发送的号码列表,必填。
  25. smsRequest.set_PhoneNumbers(phone_numbers)
  26. # 调用短信发送接口,返回json
  27. smsResponse = acs_client.do_action_with_exception(smsRequest)
  28. # TODO 业务处理
  29. return smsResponse return smsResponse

创建视图函数并绑定路由

  1. # 短信发送 视图函数
  2. def sendMsg(request):
  3. return JsonResponse(send_phone_code(request))
  4. # 8. 路由绑定
  5. urlpatterns = [
  6. url(r'^sendMsg/$', sendMsg, name='sendMsg'), # 发短信
  7. ]

ajax 点击按钮 js 代码

  1. { % block footer_js %}
  2. <script>
  3. $(function () {
  4. // 验证码按钮上绑定点击事件
  5. $(".yzm-hq").on('click', function () {
  6. // 由于this会在很多匿名函数中使用,先将其保存在一个变量中
  7. // 因为其他匿名函数中有自己的this,会和点击事件的this冲突
  8. var that = this;
  9. // 获取手机号码
  10. phone = $("input[name='phone']").val();
  11. // 通过ajax发送get请求
  12. $.get('{% url "sp_user:sendMsg" %}', { 'phone': phone}, function (data) {
  13. //判断是否请求成功
  14. if (data.ok == 1) {
  15. // 设定 60 秒后可以重新发送验证码
  16. var time = 60;
  17. // 立马 将按钮禁用 防止重复点击提交
  18. $(that).attr('disabled', true);
  19. // 颜色设置为 灰色
  20. $(that).css({ 'backgroundColor': "gray"});
  21. // 将按钮提示文字改变
  22. showMsg(that, time);
  23. // 设置周期性执行, 周期性改变显示文字内容
  24. var timer = window.setInterval(function () {
  25. // 时间减少
  26. --time;
  27. // 显示文字
  28. showMsg(that, time);
  29. // 判断是否到期
  30. if (time == 0) {
  31. // 到期后清除定时器
  32. window.clearInterval(timer);
  33. // 启用按钮
  34. $(that).attr('disabled', false);
  35. // 改变颜色和文字内容
  36. $(that).css({ 'backgroundColor': "#76bb2a"});
  37. $(that).val("获取验证码");
  38. }
  39. }, 1000)
  40. } else {
  41. alert(data.msg);
  42. }
  43. })
  44. });
  45. //改变按钮 倒计时显示内容
  46. function showMsg(obj, time) {
  47. var msg = time + "秒后重新发送!";
  48. $(obj).val(msg);
  49. }
  50. })
  51. </script>
  52. { % endblock %}

在RegisterView注册视图中验证提交的验证码核心代码

form表单中的核心验证验证码的代码

  1. # 验证码字段添加
  2. verify_code = forms.CharField(error_messages={ "required": "请填写验证"})
  3. # 单独使用一个方法校验 验证码
  4. def clean_verify_code(self):
  5. # 验证验证码是否填写正确
  6. # 获取redis中的验证码
  7. r = get_redis_connection()
  8. tel = self.cleaned_data.get('phone')
  9. s_verify_code = r.get(tel)
  10. if not s_verify_code:
  11. raise forms.ValidationError("验证码已经过期")
  12. # 表单传入的验证码
  13. verify_code = self.cleaned_data.get('verify_code')
  14. # sid_verify_code = self.data.get('sid_verify_code')
  15. if int(verify_code) != int(s_verify_code):
  16. raise forms.ValidationError("验证码输入有误")
  17. return verify_code

发表评论

表情:
评论列表 (有 0 条评论,558人围观)

还没有评论,来说两句吧...

相关阅读

    相关 验证---验证

    最近自学了短信的验证码实现。以下是自己用的一种方法实现的完整的过程。 短信验证登陆(前端+后台) 1、前端填写手机号以及点击触发,以电话号码为参数调用发送验证登录短信方法并