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命令行参数解析模块getopt使用实例
Apr 13 Python
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
Python 文件处理注意事项总结
Apr 10 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
python实现决策树分类(2)
Aug 30 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
python 模拟银行转账功能过程详解
Aug 06 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 Python
Django自带的用户验证系统实现
Dec 18 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中的串行化变量和序列化对象
2006/09/05 PHP
php Mysql日期和时间函数集合
2007/11/16 PHP
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
PHP文件读写操作之文件写入代码
2011/01/13 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
php网页病毒清除类
2014/12/08 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
jQuery学习基础知识小结
2010/11/25 Javascript
jquery中ajax学习笔记4
2011/10/16 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
python实现交并比IOU教程
2020/04/16 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
什么是网络协议
2016/04/07 面试题
员工保密承诺书
2014/05/28 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python