django 发送手机验证码的示例代码


Posted in Python onApril 25, 2018

一、流程分析:

1.用户在项目前端,输入手机号,然后点击【获取验证码】,将手机号发到post到后台。

2.后台验证手机号是否合法,是否已被占用,如果通过验证,则生成验证码,并通过运行脚本,让短信运营商向该手机号,发送该验证码,如果没通过验证,则返回错误信息

3.用户收到短信验证码以后,再次将所有信息post到后台。

4.后台验证各个数据,通过验证则完成实名制认证,如果没通过则返回错误信息。

总结,一次实名验证,需要两次ajax+post

二、对接短信商:

1.在云片网端:

1.注册云片网

地址:https://www.yunpian.com/

后台管理控制台页面:其中最重要的信息是APIKEY

django 发送手机验证码的示例代码

2.开发者备案、新增签名、新增模板(模板管理)

1.云片网后台的【测试】是没有意义的,所谓的测试,就是直接给你手机发送一条短信,这算哪门子测试?

2.【签名/模板设备】页,【签名管理】点击【新增签名】,到这里会被提醒完善【开发者信息】,认证分为开发者的【公司】和【个人】,现在是开发测试阶段,可以先选择【个人】,【个人】要身份证的照片,提交照片。

3.等待认证完成的短信通知,然后按照后台的操作指引,在【签名管理】页【新增签名】,在【模板管理】页【新增模板】,这些都要等待云片网的审核,审核通过会有短信通知。

django 发送手机验证码的示例代码

4.在云片网后台设置ip白名单,将外网ip加入白名单

django 发送手机验证码的示例代码

获取本机外网ip最简单的方法,就是百度ip

django 发送手机验证码的示例代码

2.在django项目中写发送短信的脚本

在 项目目录下 新建utils目录 新建yunpian.py

import requests
class YunPian(object):
  def __init__(self,api_key):
    self.api_key=api_key
    self.single_send_url='https://sms.yunpian.com/v2/sms/single_send.json'

  def send_sms(self,code,mobile):
    parmas={
      'apikey':self.api_key,
      'mobile':mobile,
      'text':'【**网】您的验证码是[code]。如非本人操作,请忽略本短信'.format(code=code)
    }
    #text必须要跟云片后台的模板内容 保持一致,不然发送不出去!
    r=requests.post(self.single_send_url,data=parmas)
    print(r)

if __name__=='__main__':
  yun_pian=YunPian('***************(你的apikey)')
  yun_pian.send_sms('***(验证码)','*******(手机号)')

三、在项目中写发送手机验证码相关代码:

1.前端相关代码:

<!--发送按钮倒计时代码-->
<script type="text/javascript">
var countdown=60;
function settime(obj) {
  if (countdown == 0) {
    obj.removeAttribute("disabled");
    obj.value="免费获取验证码";
    countdown = 60;
    return;
  } else {
    obj.setAttribute("disabled", true);
    obj.value="重新发送(" + countdown + ")";
    countdown--;
  }
setTimeout(function() {
  settime(obj) }
  ,1000)
}

</script>


<!--手机号码输入框代码-->

<div class="form-group">
          <label for="mobile" class="col-lg-2 col-sm-2 control-label">手机号码:</label>
          <div class="col-lg-10">
            <div class="input-group m-bot15">
          <input type="text" class="form-control" id="mobile" name="mobile" placeholder="手机号码">
          <span class="input-group-btn">
             <input type="button" id="forcode" onclick="settime(this)" value="免费获取验证码" class="btn btn-success">
          </span>
            </div>
          <p class="help-block">请填写绑定手机号</p>
          </div>
        </div>


<!--向后台通过ajax发送手机号码数据-->
<script>
  $('#forcode').click(function () {
    $.ajax({
      cache:false,
      type:"POST",
      url:"{% url 'users:forcode' %}",
      data:{
        csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val(),
        mobile:$("#mobile").val()
      },
      async:true,
      success:function (data) {
        alert(data)
      }
    })
  })
</script>

效果图:

django 发送手机验证码的示例代码

2.在users/views.py中写发送验证码相关代码:

import re
import random
from xyw.settings import APIKEY
from .models import VerifyCode


class ForCodeView(View):
  """获取手机验证码"""
  def post(self,request):
    mobile=request.POST.get('mobile','')
    if mobile:
      #验证是否为有效手机号
      mobile_pat=re.compile('^(13\d|14[5|7]|15\d|166|17\d|18\d)\d{8}$')
      res=re.search(mobile_pat,mobile)
      if res:
        #生成手机验证码
        code=VerifyCode()
        code.mobile=mobile
        c=random.randint(1000,9999)
        code.code=str(c)
        code.save()
        code=VerifyCode.objects.filter(mobile=mobile).first().code
        yunpian=YunPian(APIKEY)
        sms_status=yunpian.send_sms(code=code,mobile=mobile)
        msg=sms_status.msg
        return HttpResponse(msg)
      else:
        msg='请输入有效手机号码!'
        return HttpResponse(msg)
    else:
      msg='手机号不能为空!'
      return HttpResponse(msg)

3.在users/urls.py中:

from .views import ForCodeView
......

urlpatterns = [

  ......
  path('forcode/',ForCodeView.as_view(),name='forcode'),
]

4.在settings.py中增加代码:

#云片网apikey
APIKEY=‘你云片网的apikey'

至此,完成了发送手机验证码功能。

其实也有可以优化的地方:

1.虽然前端设置了60秒才可以重新发送,但是这个验证在后端也应该有,以防被有心人利用。

2.没有验证手机号码是否已经被发送过验证码

3.验证码没有生命周期,应该各一段时间让验证码失效

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python自动调用IE打开某个网站的方法
Jun 03 Python
python列表的常用操作方法小结
May 21 Python
django之常用命令详解
Jun 30 Python
Django2.1.3 中间件使用详解
Nov 26 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 Python
11个Python3字典内置方法大全与示例汇总
May 13 Python
python 命令行传入参数实现解析
Aug 30 Python
python简单利用字典破解zip文件口令
Sep 07 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 Python
用python对excel进行操作(读,写,修改)
Dec 25 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 #Python
详解tensorflow载入数据的三种方式
Apr 24 #Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 #Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 #Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 #Python
Windows上使用Python增加或删除权限的方法
Apr 24 #Python
python编写暴力破解zip文档程序的实例讲解
Apr 24 #Python
You might like
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
PHP微信支付实例解析
2016/07/22 PHP
php图像验证码生成代码
2017/06/08 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
React diff算法的实现示例
2018/04/20 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
python采用getopt解析命令行输入参数实例
2014/09/30 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
Django视图类型总结
2021/02/17 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
领导证婚人证婚词
2014/01/13 职场文书
大学生年度个人总结
2015/02/15 职场文书
世界气象日活动总结
2015/02/27 职场文书
爱心募捐通知范文
2015/04/27 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
详解MongoDB的条件查询和排序
2021/06/23 MongoDB