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之折腾一下目录
Oct 24 Python
Python获取单个程序CPU使用情况趋势图
Mar 10 Python
Python入门教程之if语句的用法
May 14 Python
Python多进程同步简单实现代码
Apr 27 Python
简述Python2与Python3的不同点
Jan 21 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
flask-restful使用总结
Dec 04 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
如何在Cloud Studio上执行Python代码?
Aug 09 Python
利用Python实现kNN算法的代码
Aug 16 Python
Python class的继承方法代码实例
Feb 14 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
第二节 对象模型 [2]
2006/10/09 PHP
php 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
33种Javascript 表格排序控件收集
2009/12/03 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
Python格式化日期时间操作示例
2018/06/28 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
科室工作的个人自我评价
2013/10/30 职场文书
优秀研究生自我鉴定
2013/12/04 职场文书
会计学自荐信
2014/06/03 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
租车协议书范本2014
2014/11/17 职场文书
请客吃饭开场白
2015/06/01 职场文书
详解Go语言中Get/Post请求测试
2022/06/01 Golang
分享几个实用的CSS代码块
2022/06/10 HTML / CSS