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入门指引
Apr 01 Python
Python实现包含min函数的栈
Apr 29 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Python实现的爬取百度贴吧图片功能完整示例
May 10 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
python命名空间(namespace)简单介绍
Aug 10 Python
python输入错误后删除的方法
Oct 12 Python
Python绘图实现台风路径可视化代码实例
Oct 23 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 Python
Python+Appium自动化测试的实战
Jun 30 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
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
PHP7.0版本备注
2015/07/23 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
javascript下数值型比较难点说明
2010/06/07 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
Python 实现向word(docx)中输出
2020/02/13 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
营销学习心得体会
2014/09/12 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
英语邀请函范文
2015/02/02 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers