本文正在参加「Python主题月」,详情检查 Python 创造季,秀出你的 Python 文章 – 2000元约束奖品等你赢

项目gitee地址 saas
本篇教程对应代码为 【saas是什么意思啊注册验证码处理】提交,可经过对应分支检查长沙商贸旅行作业技术学院

用户注册篇

首要工程造价,全体的思想导图如下:
django 开发Bug追寻渠道之用户注册篇(根据腾讯云短信 & redis)|Python 主题月

1. 前期预备

1.1 腾讯云发送短信

  • 项目中的登录 & 注册功用输入框测试用例,需求运用手机号进行短信的接收,这儿用到了腾讯云短信
  • py枸杞thon 操作教程腾讯云短信详细教程可检查此篇博文:Python 操作腾讯云短信(sms)详细教程

1.2 redis

  • redis 的下载安装以及python 操作redis 可检查此篇博文: redis 下载安装 & python 操作redis & django 联接redis

2. 注册页面展示

2.1 创立app

  • 创立一个名为 web 的app,之后的代码都在这个app里边写
    python manage.py startapp web
    

2.2 app注册

  • settings.py 文件中注册app,INSTALLED_APPS 增加自己方才创立的app【默许应该是狗狗币现已增加了,没有google的话自己增加】一下

    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config长沙市气候',
    'web.apps.WebCo仓鼠寿数nfig',
    ]
    

2.3 母版预备

2.3.1 插件引入

  • 在创立母版之前咱们需求先引入 bootstrap、js 等插件,能够运用 cdn,也能够下载离线运用,这儿咱们将其下载下来,放置到 stati输入框不出来c 文件夹中,便利咱们往后运用

离线文件能够自己去官网下载,也能够拿我这儿现已下载好的,我将其放在网盘中,需求可自行下载,其间包括: js、bootstrap、font-awesome【图标】
链接:pan.baidu.com/s/1gQRN57教程动漫人物Xg…

提取码:mnjl
解压暗码: ruochen666

  • web 下创立一个用于寄存静态文件的 static 文件夹,然后再创立一个 plugin 文件夹,用于寄存东西类文件,然后将下载好的 js、bootstrap、fon长生十万年t-awesome 放置到 static 文件夹中,结构如下图

django 开发Bug追寻渠道之用户注册篇(根据腾讯云短信 & redis)|Python 主题月

  • 接下来咱们要运用的时分就能够直接引入 static 文件陈思思夹下的文件

2.3.2 母saas产品

为什么要用到母版?
前端页面中,注册和登录的页面底子相似,咱们能够让这两个宫颈癌页面都继承自母版,做到代码重用

  • web 下创立一个 templsaasates 文件夹,在 templates 文件夹下再创立一个 layout 文件夹放咱们的母版文件 basic.html
    • 结构如下

django 开发Bug追寻渠道之用户注册篇(根据腾讯云短信 & redis)|Python 主题月

- `basic.html` 代码如下,其间的导航条款式能够直接从 [bootstrap官网组件](https://v3.bootcss.com/components/#navbar) 拿过来批改一下即可
```html
{% load static %}
<!DOCTYPE html>
<h教程的意思tml lang="en"输入框变小了怎样回事>
<head>
<meta charse输入框款式t="UTF-8">
<title>{% blo长沙商贸旅行作业技术学院ck title %}{% endblock %}</title>
<link rel="stylesheet" href="https://juejin.im/post/698165109教程拼音0093637662/{% static '/plugin/bootstrap/css/bootstrap.min.css' %}">
<link rel="stylesheet" href="https://ju工商银行ejin.im/post/6saas981651090093637662/{% st输入框跑到上面了怎样办atic '/plugin/font-awesome/css/font-awesome.min.css' %}">
<style>
.navbar-d长沙商贸旅行作业技术学院efault{
border-radius: 0;
}
</style>
{% block css %}{% endblock %}
</hea输入框代码d>
<body>
<nav class="navbar navbar-default教程视频怎样制作方法">
<div class=输入框代码"container">
<!-- Brand and toggle get grouped for better mobile display陈思思 -->
<div class="navbar-header">
<butto教程诀窍2n t教程英文ype="button" class="navbar-toggle cogooglellapsed" data-toggCSSle="collapse"
data-target="#bs-examp枸杞le-navbar输入框不出来-collapse-1" aria-expanded=SaaS"false">
<span class="sr-only">龚俊Toggle navigatio输入框测试用例n</span>
<span class="icon-b教程之家ar"></span>
<span class="icon-bar"></span>
<span class="icon-ba输入框怎样调巨细r"></span>
<SaaS/button>
<a class="navbar-brand" href="#">Tracer&lt输入框跑到上面了怎样办;/a>
</div>
<!-- Colle工商管理ct the nav links, forms,教程之家 an教程诀窍2电影d other content for toggling -->
<d枸杞iv class="collapse navbar-collapse" id="bs-example-navbar-co工商银行llapse-1">
<ul class="Gonav navbar-nav龚俊">
<li>&l输入框里的字怎样弄t;a href="#">产品功用</a></li>
<li><a href="#">企业计划</a></li>
<li><a href="#">协助文档</a></li>
<li><a href="#">价格</a></li&gsaas服务t;
</ul>
<ul class="长沙商贸旅行作业技术学院nav navbar-nav navbar-right">
<li><a href="#">Link</a></li>
<li class="dropdown">
<a h陈涉世家翻译及原文ref="#" class="dropdown-togg宫颈癌le" d陈涉世家翻译及原文a输入框代码ta-toggle="dropdown" role="教程动漫人物button" aria-haspopup="SaaStrue"
aria-expanded="false">Dropdown <span class="caret宫颈癌前期症状"></span></a>
<ul class="dropdown-menu">
<li>saas体系哪个公司做的最好<a h输入框里的字怎样弄re输入框变小了怎样回事f="#">Action&lt教程诀窍2;/a></li&工商管理gt;
<li><a href=陈涉世家翻译及原文"#">Another action</a></li>
<li>&lt辰时是几点到几点;a href="#"&陈涉世家翻译及原文gt;Something else here</a></li>
<li role="separator" clas教程拼音s="divider"&CSSgt;</li>
<li><a href="#"&教程动漫人物gt;Separated link</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
{% block content %}{% endblock %}
<script src="http工商管理s://juejin.im/post/6981651090093637662/{% static 'js/jquery-3.4.1.min.js' %}"></scrip公积金t>
<script srCSSc="https://juejin.im/post/6981651090093637662/{% static 'plugin/bootstrap/css/bootstrap.min.css' %}"></script>
{% block js %}{% endblock %}
</body>
</html>
```

2.4 URL预备

  • MyDjango/MyDjango/urls.py 【我的项目名称为 MyDjango

    """MyDjango URL Configuration
    Tsaas渠道是什么意思he `urlpatterns`辰时是几点到几点 list routessaas怎样读 URLs to views. For more information ple教程拼音ase see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
    Examples:
    Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpa狗狗币tterns:  url(r'^$', views.home, name='home')
    Class-based views
    1. Addgoogle an import:  from other_app.views import Home
    2. Add a URL to urGolpatterns:  url(r'^$', Home.as_view(), name='home')CSS
    Includsaas产品ing another URLconf
    1. Import the include() func输入框图片tion: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^bl公积金og/', include('blosaas怎样读g.urls'))
    """
    from django.conf.urls import ugooglerl, include
    from django.contrib import admin
    urlpatterns = [
    url(r'^admin/', adm教程诀窍2电影in.site.urls),
    url(r'^/', include(输入框怎样调巨细'web辰时是几点到几点.urls')),
    ]
    
  • 在 web 文件夹下创立 url工商管理s.py 文件,用于办理该app 的路由(视图函数咱们下面会写)
    # -*- coding: UTF-8 -*-
    'saas怎样读''======================教程诀窍2电影===========================
    @P陈涉世家翻译及原文roject -> File   :MyDjango -> urlssaas怎样读
    @IDE    :PyCharm
    @Author :ruochen
    @Date   :2020/7/2 1:18
    @Desc   :
    ==========================================输入框变小了了========'''
    from dj工商管理ango.宫颈癌前期症状conf.urls import url
    from web.views import account
    urlpatterns = [
    url(r'^register/$', account.register, name='register'),  # register
    ]
    

2.5 模型预备【models.py】

  • 用户注册时,要填写的数据有
    • 工程造价户名
    • 邮箱
    • 手机号
    • 暗码
  • web/models.py输入框里的字怎样弄件中创立一个 UserInfo 类,代长沙师范学院码如下
    from django.db import models
    class UserInfo(models.Model):
    username = models.CharField(verbose_namesaas是什么的简称='用户名', max_length=32)
    email = models.EmailField(verbose_name='邮箱', max_length=32)
    mobile_phone =输入框测试用例 models.CharField(verbose_name='手机号', max_length=32)
    password = models.CharField(verbose_name='工商银行暗码', max_length=32)
    def __s教程之家tr__(self):
    rsaas服务eturn sel潮汕是哪个省的城市f.username
    
  • 搬家数据库
    python manage.py makemigrations
    python教程英文 manage.py migrate
    

2.5 视图函数

  • 输入框代码web 下的 v输入框不出来iews.py 文件删除,创立一个 views 文件夹,便利办理咱们的视图,然后在 views 文件夹下创立一个 account.py 文件作为注册视图,代码如下:(RegisterModelsaas渠道是什么意思Formregister.html后边会写Go)
    from django.shortcuts import render
    from web.forms.acco输入框测试用例unt import RegisterModelForm
    def register(request):
    form = Regi狗狗币sterModelForm()
    return render(request, 'register.html', {'form': form})
    

2.6 M教程诀窍2odelForm【简略校验 & 款式增加】

  • 前端页面要经过Form 表单循环生成数据,可是直接生成的话有点丑,而且数据也要先做一些底子的校验【例仓鼠养殖八大忌讳如手机号仓鼠寿数,钩子函数在后边校验表单时用到,这儿先经过正则简略的校验一下手机号】
  • web 文件夹下创立一个 forms 文件夹,forms 文件夹中创立 account.py 文件,代码如下
    • 一: 对字段进行处理,例如手机号进行校验,暗码为 PasswordInput 方式等
    • 二:给每个字段增加 form-control 款式,前端页面闪现比较美丽一点
    • 三:增加 code 【验证码】字段
    # -*- coding: UTF-8 -*-
    '''=================================================
    @Pr长生十万年oject -> File   :MyDjango -> account
    @IDE    :PyCharm
    @Author :ruochen
    @Date   :2020/7/2 12:教程手绘37
    @Desc   :
    =================================================='''
    from dj教程拼音ango impoCSSrt forms
    fr龚俊om django.core.validators import RegexValidator
    from web import m工商银行odels
    class RegisterModelForm(forms.ModelForm教程的意思):
    mobile_phone = forms.CharField(
    label教程的意思='手机号',
    valsaas怎样读idators=[RegexVsaas渠道是什么意思alidsaas体系是什么ator(r'^(1[3|4|5|6|7|8|9])d{9}$', '手机号格局过失'),google ])
    password = forms.CharField(
    label='暗码', widget=forms.PasswordInput())
    confirm_password = forms.CharField(
    label='重复暗码',
    widget=forms.PasswordInput())
    code = forms.CharField(
    label='验证码',
    w长沙师范学院idget=forms.TextInput())
    class Meta:
    model = models.Use公积金rInfo
    fields = ['usernam教程的意思e', 'email',saas体系哪个公司做的最好 'password', 'confirm_password', 'mobile_phone', 'code']
    def __init__(self, *args, **kwargs):
    super().__init__潮汕是哪个省的城市(*args, **kwargs)
    for name, field in self.fields.items():
    field.widget.attrs['class']Go = 'form-control'
    field.widget.attrssaas是什么意思啊['placeholder'] = '请输入{}'.format(field.label,)
    
  • 运用上述代码是没有任何问题的,可saas服务是,关于增加 form-control 特色,之后的代码中其他字段都要用到,每次运用for 循环增加很显然有些赘余,咱们能够将其封装在一个类中,这样,需求增加款式的时分直接继承google这个类就能够了。
  • 批改如下,在 web/forms 下创立一个 bootstrap.py 文件,代码如下:
    # -*- coding: UTF-潮汕是哪个省的城市8 -*-
    '''=============saas产品=================潮汕是哪个省的城市==============输入框图片=====
    @Proj长沙师范学院ect -> File   :MyDjango -> bootstrap
    @IDE    :PyCharm
    @Author :ruochen
    @Date   :2020/7/3 16:25
    @Desc   :
    =================================================='''
    class BootStrapForm(obCSSject):
    bootsaas产品是什么意思啊strap_class_exclude = []
    def __init__(self, *args, **kwa长生十万年rgs):
    super().__ini潮汕是哪个省的城市t__(*args, *教程之家*kwargs)
    for name, field in self.fi输入框代码elds.items():
    if name in self.bootstrap_cla工商管理ss_exclude:
    continue
    old_class = field.widget.attrs.get('class', '')
    field.widget.attrs['class'] = '{} form-control'.format(old_class)saas渠道是什么意思
    field.教程手绘widget.attrs龚俊['pl辰时是几点到几点aceholder'] = '请输入{}'.format(fielsaas体系是什么d.label,)
    
  • 然后 forms/account.py 文件批改为saas产品
    from django import forms
    from django.coreGo.validators import RegexV长沙商贸旅行作业技术学院alidator
    from web import model宫颈癌s
    from web.forms.bootstrap import BootStrapForm
    class RegisterModelForm(BootStrapForm, forms.ModelForm):
    password = forms.CharField(
    label='暗码',
    min_length=8,
    max_length=64,
    error_messages={
    'min_length': "暗码长度不能小于8个字符",
    'max_length': "暗码长度不能大于64个字符"
    },
    widget=forms.PasswordInput())
    confirm_password =saas产品是什么意思啊 forms.CharField(
    label='重复暗教程拼音码',
    min_length=8,
    max_length=64,
    error_messages={
    'min_length': "重复暗码长度不能小于8个字符",
    'max_Golength': "重复暗码长度不能大于64个字符"
    },
    widget=forms.Passwor教程视频怎样制作方法dInput()
    )
    mobile_phone = forms.CharField(
    label='工程造价手机号',
    validato输入框rs=[RegexValidator(r枸杞'^(1[3|4|5|6|7|8|9])d{9}$', '手机号格局过失'), ])
    code = forms教程诀窍2电影.CharField(
    label='验证码',
    widget=forms.Texsaas渠道是什么意思tInput())
    class Meta:
    mode输入框变小了了l = models.UserInfo
    fields = ['username'saas渠道是什么意思, 'email', 'password', 'confirm_password', 'mobile_phone', 'code']
    

2.7 前端页面

  • templates枸杞 文件夹下创立 register.输入框不出来html 文件夹,让其继承自 basic.h输入框变小了怎样回事tml
  • 前端页面关于字段的展示,教程诀窍2直接循环展示 form 表单生成的数据即可
    {% extends 'layout/basic.html' %}
    {% load static %}
    {% block title %} 用户注册 {% endblock %}
    {% block css %}
    <link rel="stylesheet" href="https://juejin.im/post/6981651090093637662/{% ssaas产品t陈涉世家翻译及原文atic 'css/account.css' %}">
    {% endblock %}
    {% block content %}
    <div class="account">
    <div class="title">宫颈癌前期症状用户注册</div>
    <forsaas体系哪个公司做的最好m id="form" method="post" novalidate>
    {% csrf_token %}saas是什么意思啊
    {% for field in form %}
    {% if field.name == 'code' %}
    <div class="form-group">
    <label for="{{ field.id长沙商贸旅行作业技术学院_forSaaS_label }}">{{ field.label }}</label>
    <div class="row">
    <div class="col-xs-7">
    {{ field }}
    <span class="error教程-msg">{{ field.errors教程视频怎样制作方法.0 }}</span>
    </div>
    <div class="col-xs-5SaaS">
    <input id="smsBtn" tySaaSpe="busaas产品是什么意思啊tton" class="btn btn-default" value="点击获取验证工程造价码"/>
    </div>
    </div>
    </div>
    {% else %}
    <div class输入框测试用例="form-group">
    <label for="{{ field.id_for_label }}">{{ field.lable }}</label>
    {{ field }}
    <span class="error-msg">{{ field.errors.0 }}</潮汕是哪个省的城市span>
    </div>
    {% endif %}
    {% endfor %}
    <div class="row">
    <div class="col-xs-3">
    <input id="submit" type="button" class="btn btnsaas产品是什么意思啊-primary" value="注  册"/&g长沙师范学院t;
    &ltsaas服务;/div&gt教程;
    </div>
    </form>
    </div>
    {% endbl仓鼠寿数ock %}
    {% block js %}
    {% endb输入框跑到上面了怎样办lock %}
    

django 开发Bug追寻渠道之用户注册篇(根据腾讯云短信 & redis)|Python 主题月

3. 验证码获取

3.1 思路

  • 给获取验证码按钮绑定作业,在前端页面中,用户点击获取验证码后,经过腾讯云短信向用户手机号发送验证码,而且在页面上闪现60s倒计时,向后端发送ajax央求
  • 后端进行手机号校验(判别手机号是否现已注册过)和短信模板的验证(腾讯云短信的一些凭证)

3.2 详细完毕

3.2.1 前端代教程

  • register.html 中增加js 代码,代码如下
    {% extends 'layout/basic.html' %}
    {% load static %}
    {% block title %} 用户注册 {% endblock %}
    {% block css %}
    <link rel="stylesheet" href="https://juejin.im/post/工程造价6981651090093637662/{% static 'css/accougooglent.css' %}"&g工商管理t;
    <style>
    .error-msg {
    color: red;
    position: absolute;
    font-size: 13px;
    }
    </style>
    {% endblock %}
    {% block content %}
    <div class=教程之家"a教程诀窍2ccount"&gt教程诀窍2电影;
    <div class="title">用户注册</div>
    <form id="form" method="POST" novalidate>
    {% csrf_token %}
    {% for field in form %}
    {% if field.nsaas产品是什么意思啊ame == 'code' %}
    <div class="form-group陈涉世家翻译及原文">
    <label for="{工程造价{ field.id_for_label }}">{{ field.label }}</label>
    <di工程造价v class="row">
    <div class="col-xs-7">
    {{ field }}
    <span classsaas服务="error-msg"></span>
    </div>
    <div class="c工商银行ol-xs-5">
    <input id="btnSms" type="button" class="btn btn-default" value="点击获取验证码">
    </div>
    </div>
    </div>
    {saas% else %}
    <div class="form-group">
    <label for="{{ field.id_for_label }}">{{ field.label }}</label>
    {{ field }}
    <s龚俊pan class="error-msg"></span>
    </div>
    {% endif %}
    {% endfor %}
    <div class长沙师范学院="row">
    <div class="col-xs-3">
    <input id="submit" type="b长沙市气候utton" class="btn btn-primary" value="注  册"/>
    </d狗狗币iv>
    </div>
    </form>
    </div&g工商银行t;
    {% endblock %}
    {% bl辰时是几点到几点ock js %}
    <script>
    // 页面结构加载完毕之后主动实施函数
    $(function () {
    bindClickBtnSms();
    });
    /*
    点击获取验证码的按钮绑定作业
    */
    functio输入框跑到上面了怎样办n bindClickBtnSms() {
    $('#btnS工商银行ms').click(function () {
    $('.errorsaas产品-msg').empty();
    // 获取用户输入的手机号
    // 找到输入框的ID,根据ID获取值,怎样找到手机号的ID?
    // Django ModelForm 默许生成字段ID为 “id_教程诀窍2电影 + 字段名”
    va长沙师范学院r mobilePhone = $('#id_mobile_phone').saas怎样读val();
    // 发送ajax 央求,把手机号发送曾经
    $.ajax输入框({
    url陈涉世家翻译及原文: "{宫颈癌前期症状% url 'send_sms' %}",  // 等价于 /send/sms/
    type: "GET",
    data: {mobile_phone: mobilePhone, tpl: "register"},  // 手机号和注册的模板
    dataType: "JSON",教程的意思  // 将服务端回来仓鼠寿数的数据反序列化为字典
    success: function (res) {
    // ajax央求发送成功之后,主动实施的函数: res便是Go后端回来的值
    if(res.status) {
    sendSmsRemind();
    } else {
    // 过失信息
    // console.log(res);  // {status: False, error: { mobile_phone: ["过失信息", ] }
    $.工程造价each(res.error, function (key, value) {
    $("#id_" + key).next().text(仓鼠养殖八大忌讳value[0]);saas是什么意思啊
    })
    }
    }
    })
    })
    }
    /*
    倒计时
    *输入框里的字怎样弄/
    function sendSmsRemind() {
    var $smsBtn = $('#btnSms');
    // 将按钮变为不行点击
    $smsBtn.prop('disabled', true);
    var time = 60;
    var rsaas是什么意思啊emind = setInterval(function () {
    $smsBtn.val(time + '秒从头发送');
    time = time - 1;
    if (time < 1) {
    clearInterval(remind);
    $smsBtn.val('点google击获取验证码').prop('disabled', false);
    }
    }, 1000)
    }
    </script>
    {%输入框图片 endblock %}
    

前端页面60s倒计时用到了定时器功用,如下

var obj = setInterval(function(陈涉世家翻译及原文){  // 创立定时器,此处输入框就相当于每1秒实施一次function函数
console.log(123);
}, 1000)
clearInterval(obj);  // 封闭定时器

那么,关于60s的倒计时功用,咱们就能够运用如下代码完毕

var time = 60;
var obj = setInterval(function(){
time = time - 1;
if(time < 1) {
clearInterval(obj);
}
}, 1000)
  • 其间有个 account.css 是自己写的css 款式,在输入框图片 web/static 文件夹下新建一个 css 文件夹用于寄存工程造价自己写的css 款式,然后狗狗币新建一个 account.css 文件,教程手绘代码如下
    .account {
    width: 400p输入框款式x;
    margin-top: 30px;
    m输入框怎样调巨细a仓鼠养殖八大忌讳rgin-left: auto;
    margin-righ陈思思t: auto;
    bor教程der: 1px solid #f0f0f0;
    padding: 10px 30px 30px 30px;google
    -webkit-box-shSaaSadow:工商管理 5px 10px 10px rgb教程之家a输入框里的字怎样弄(0, 0, 0, .05);
    box-shadow: 5px 10px 10px rgba(0, 0, 0, .05);
    }
    .acco辰时是几点到几点unt .title {
    font-size: 25px;
    font-weight: bold;
    text-align: center;
    }
    .account .form-group {陈思思
    margin-bottom: 20px;
    }
    

3.2.2 后端代码

3.2.2.1 URL
  • 首要,上面写到前端页面经过js 向后端发送ajax 央教程诀窍2电影求,央教程的意思求地址为 /sen教程英文d/sms/,那么咱们首要要增加一个 urlweb/urls.py 中代码如下:
    from django.conf.urls import url
    from web.views import account
    urlpatterns = [
    url(r'龚俊^register/$', accsaas是什么意思啊ount.register, name='register'),  # register
    url(r'^send/陈涉世家翻译及原文sms/$', account.send_ssaas是什么意思啊ms, name=工程造价'send_sms'),  # register
    ]
    
3.2.2.2 视图函数
  • 上面增加了路由,接下来是视图函数,在 web/views/account.py 文件中增加代码如下
    from django.sh教程动漫人物ortcuts import rendesaasr, Http输入框款式Response
    from django.http import JsonResponse
    from web.forms.account impor教程手绘t RegisterModelForm公积金, SendSmsForm
    def register(reques长沙商贸旅行作业技术学院t):
    """ 注册 """
    form = RegisterModelForm()
    return render(request, 'register.html', {'form': form})
    def send_输入框图片sms(request):
    """ 发送教程之家短信 """
    form = SendSmsForm(request, data=request.GET)
    # 仅仅校验手机号:不能为空、格局是否正确
    if form.is_valid():
    return JsonResponse({'status': True})
    return JsonResponse({'status': False, 'error': form.errors})
    
3.2.2.3 装备文件
3.2.2.3.1 腾讯云短信配教程手绘备文件
  • 关于腾讯云短信的装备文件,咱们应该将其放置在 local_sett输入框里的字怎样弄ings.py 文件中( local_settings.py 文件的作用,我在上一篇文章中提到过),一起要在 se工商银行ttings.py 文件中声明
  • local_set宫颈癌tings.py 文件装备代码如下
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.pasaas是什么的简称th.abspath(__file__)))
# --------- sms -----------
# 腾讯云短信运用的 app_iCSSd
TENCENT_SMS_APP_ID = '自己的app_id'
# 腾讯云短信狗狗币运用的 app_工程造价key
TE宫颈癌前期症状NCENT_SMS_APP_KEY = '自己的app_key'
# 腾讯云短信签名内容
TENCENT_SMS_SIGN = 'xxxx'
# 短信模板
TENCENT_SM输入框怎样调巨细S_TEMPLATE = {
'register': '长沙商贸旅行作业技术学院xxxx',
'陈思思login': 'xxxx',
}

关于腾讯云短信的装备,可检查此篇文章:Python 操作腾讯云短信(sms)详细教程

  • 这儿的 app_id & app_key 便是文中提到的创立运用后的 AppID &amsaas渠道是什么意思p; A辰时是几点到几点ppKey
  • 短信签名内容便是在创立签名后闪现的那个内容,比方我这个是 小小猿若尘 ,如下

django 开发Bug追寻渠道之用户注册篇(根据腾讯云短信 & redis)|Python 主题月

  • 短信模板便是创立了模板后对应的 ID
  • settings.py 文件中也要声明如下(settings.py文件毕竟增加下面代码,赋值随意填,由于咱们在毕竟导入了 local_settings.py 文件,项目实际上运用的是 local_settings.py 文件中的装备,这儿写仅仅为了声明一下,因输入框变小了怎样回事为咱们的 local_settings.py 文件是不会给别人的)
# --------- sms -----------
# 腾讯云短信运用的 app_id输入框款式
TENCENT_SMS_APP_ID = 6666
# 腾讯云短信运用的 app_key
TENCENT_SMS_APP_KEY = '6666'
# 腾讯云短信签名内容
TENCENT_SMS_SIGN = 'xxxx'
# 短信模板
TENCENT_SMS_TEMPLATE = {
'register': 666666,
'login': 666666,
}
3.2.2.3.2 redis 装备文件
  • redis的详细操作可检查此篇文章: re工商管理dis 下载安装 & python 操作redis & django 联接redis,这儿用到的便是 django-redis 模块【记得安装】
  • redis的装备放在 local_settings.py教程诀窍2文件中,代码如下:
    CACHES = {
    "d教程的意思efault": {
    "B输入框跑到上面了怎样办ACKEND"saas体系是什么: "django_redis.cache.RedisCache",
    "LOCATION": "redis://192.168.1.6:6379",  # 在终端中经过 [ipconfig] 指令检查
    "OP枸杞T教程之家IONS": {
    "CLIENT_CLAS教程英文S": "django_redis.client.DefaultClient",
    "CONNECTION_POOL_KWARGS": {
    "max_conGonections": 1000,
    "encoding": 'utf-8'
    },
    "PASSWORD": "root"  # 暗码,上述文章有详细说明
    }
    }
    
3saas服务.2.2.4 SendSmsForm
  • 在上面视图函数中咱们经过 SendSmsForm 进行了校验,web/forms/account.py 文件中代码如下
    • 一:对手机号、短信模板进行了校验
    • 二:运用 腾讯云短信 向用户发送短信
      • 在项目目录下创立 utils 文件夹,寄存咱们的东西类,再创立一个 tencentgoogle件夹,在文件夹下创立 sms.py 文件, 如下:

      django 开发Bug追寻渠道之用户注册篇(根据腾讯云短信 & redis)|Python 主题月

      • sms.py 文件代码如下

        # -*- coding: UTF-8教程之家 -*-saas
        '''====工程造价=============================================
        @Project -> File   :MyDjango -> sms
        @IDE    :PyCharm
        @Author :ruochen
        @Date   :2020/6/21 15:57
        @Desc   :
        =================================================='''
        import ssl
        # ssl._create工程造价_default_https_context = ssl._create_unverified_context
        from qcloudsms_py import SmsMultiSend长沙市气候er, SmsSingleSender
        from qcloudsms_py.httpclient import HT输入框不出来TPError
        from django.教程视频怎样制作方法conf import settings输入框不出来
        def sesaas渠道是什么意思nd_sms_single(phone_num, template_id, template_saas渠道是什么意思param_list):
        "saas渠道是什么意思""
        单条发送短信
        :param phone_num: 手机号
        :param temgoogleplate_id: 腾讯云短信模板ID
        :param template_param_list: 短信模板所需参数列表,例如:【验证码:{1},描绘:{2}】,则传递参数 [888,666]按次第去格局化模板
        :return:
        """
        appid = settings.TENCENT_SMS_APP_ID  # 自己运用ID
        appkey = settings.TENCENT_SMS_APP_KEY  # 自己运用Key
        sms_sign = settings.TENCENT_SMS_S枸杞IGN  # 自己腾讯云创立签名时填写的签名内容(运用大众号的话这个值一般是大众号全称或简称)
        sender = SmsSingleSender(appid, appkey)
        try:
        response = sendsaas渠道是什么意思er.send_with_param(86, phone_num, template_id, temGoplate_param_list, sign=sms_sign)
        except HTTPError as e:
        response = {'result': 1000, 'errmsg': "网络异常发送失利"}
        return resp教程之家onse
        def sendCSS_sms_multi(教程诀窍2电影phone_枸杞num_list, templa输入框te_id, param_list狗狗币):
        """
        批量发送长沙商贸旅行作业技术学院短信
        :param phone_num_list:手机号列表
        :param template_id:腾讯云短信模板ID
        :param param_list:短信模板所需参数列表,例如:【验证码CSS:{1},描绘:{2}】,则传递参数 [888,666]按次第去格局化模板
        :r输入框不出来eturn:
        """
        ap陈思思pid = settings.TENCENT_SMS_APP_ID  # 自己saas运用ID
        appkey输入框怎样调巨细 = settings.TENCENT_SMS_APP_KEY  # 自己运用Key
        sms_sign = settings.TENCENT_SMS_SIGN  # 自己腾讯云创立签名时填写的签名内容(运用大众号的话这个值一般是群输入框里的字怎样弄众号全称或简称)
        sender = SmsMultiSender(appid, appkey)
        try:
        respon输入框款式se = sender.send_with_param(86, phone_num_list, template_id, param_list, sign=sms_sign)
        exce工商银行pt HTTPErr教程orsaas是什么的简称 as e:
        response = {'result':教程之家 1000, 'errmsg': "网络异常发送失利"}
        return response
        
    • 三: 将验证码存入redis数据库中,且超时时间为 60s【即60s后主动消失】,这样咱们在提交表单的时分,就能够saas怎样读将用户输入的验证码同redis中存的进行比较,且假设时间逾越 60s,用户就要从头获取验证码
      • redis的操作能够检查此篇文章: redi输入框跑到上面了怎样办s 下载安装 & python 操作redis & django 联接redis
    #-*- coding: UTF-8 -*-
    '''===========狗狗币======================================
    @Proje长生十万年ct -> File   :MyDjango -> account
    @IDE    :PyCharm
    @Author :ruochen
    @Date   :2020/7/2 12:37
    @Desc   :
    =================================================='''
    import ranSaaSdom
    from django import forms
    from django.core.validators import RegexValidator
    from dsaas产品jango.core.exceptions import V输入框跑到上面了怎样办alidationError
    fromsaas产品是什么意思啊 django.conf import setti输入框里的字怎样弄ngs
    from django_redis import get_redis_connection
    from web import mo教程视频怎样制作方法dels
    from web.saasforms.bootstrap import BootStrapFo教程英文rm
    from ut长沙市气候ils.tencent.sms import send_sms_single
    class工程造价 RegisterModelForm(BootStrapForm, forms.ModelForm):
    password = forms.CharField(
    label='暗码',
    min_length=8,
    max_length=64狗狗币,
    error_messages={
    'min_length': "暗码长输入框怎样调巨细度不能小于8个字符",
    'max_lesaas是什么意思啊nsaas是什么的简称gth': "暗码长度不能大于64个字符"
    },
    widget=forms.PasswordInput())
    confirm_password枸杞 = forms.CharField(
    label='重复暗码',
    min_length=8,
    max_leng教程手绘t狗狗币h=64,
    error_messages={
    'min_length': "重复暗码长度不能小于8个字符",
    'max_length': "重复暗码长度不能大于64个字符"
    },
    widget=forms.PasswordInput()辰时是几点到几点
    )
    mobile_phone = fo教程手绘rms.CharField(
    label='手机号',
    va宫颈癌lidators公积金=[RegexValidator(r'^(1[3|4|5|6|7|8|9])d{9}$', '手机号格局过失'), ])
    code = forms.CharField(
    lasaas渠道是什么意思bel='验证码',
    widget=forms.TextInput())
    class Meta:
    model = models.UserInfo
    fields = ['usern教程ame', 'em输入框图片ail', 'password', 'confirm_password', 'mobile_phone', 'co教程诀窍2de']
    class SendSmsForm(forms.Form):
    mobile_phonesaas = forms.CharFie输入框怎样调巨细ld(label='手机号', validatGoors=[Reg辰时是几点到几点exValidator(r'^(1[3|4|Go5|6|7|8|9])d{9}$', '手机号格局过失'), ])
    def __init__(self, request, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.request = re长沙商贸旅行作业技术学院quest
    def clean教程英文_mobile_phone(self):
    """ 手机号校验的钩子 """
    mobile_phone =教程视频怎样制作方法 self.仓鼠寿数cleaned_data['mobile_工商管理phone']
    # 判别短信模板是否有问题
    tpl = self.request.GE陈思思T.get('tpl')
    template_id = settings.TENCENT_SMS_TEMPLATE.get(tpl工商银行)
    if not template_id:
    # self.add_error('mobile_phone', '短信模板过失')
    raise ValidationError('短信模板过失')
    # 查验数据库中是否已有手机号
    exists = models.UserInfo.objects.filter(mobile_phone=mobile_phone).exists()
    if ex教程英文ists:
    raise ValidationError('手机号已存在')
    # 发短信
    code = random.r教程视频怎样制作方法andrange(1000, 9999)
    # 发送短信
    sms = send_sms_singl长沙商贸旅行作业技术学院e(mobile_phone, template_id, [code, ])
    if sms['result'] != 0:
    raise ValidationError('短信发送失利,{}'.format(sms['errmsg']))
    # 验证码写入redis(django-redis)
    conn = get_redis_connection()
    conn.set(mobile_phone, code, ex=60)
    return mobile_phone陈涉世家翻译及原文
    

4. 点击注册

4.1 前端: 获取数据 & 发送ajax央求

  • 收集表单输入框不出来中的数据(找到每一个字段)
  • 数据经过ajax发送到后台【POST央求】
  • register.html 文件中js 部分增加点击注册作业函数,代码如下(前面代码部分同上,仅仅在js公积金 中增加了 bindClickSubmit 函数,并让其在页面结构加载完毕后主动实施)

ajax央求这儿我没有再写一个URL,而输入框代码是复用了 /regisaas是什么的简称ster/,只需求判别用户发的是哪种央求就能够

  • 用户横竖地址时发送的是 GET 央求,这时咱们直接让其跳转到注册页面即可
  • 用户点击注册时,发送的输入框图片POST 央求,这时咱们进行表单验证 & 写入数教程拼音据库等操作即可
{% block js %}
&长沙商贸旅行作业技术学院lt;script>
// 页面结构加载完毕之后主动实施函数
$(function () {
bindCli长沙市气候ckBtnSms();
bindClickSubmit()教程诀窍2;
});
/*
点击提交(注册)
*/
function bindClickSubmit() {
$('#btnSubmit').click(function () {
$('.error-msg').empty();
// 收集表单中的数据(找到每一个字段)
// 数据经过ajax发送到后台
$.ajax({
url: "{% url 'register'辰时是几点到几点 %}",
type: "POST",
data: $('#regForm').serialize(),  // 获取表单中全部的键值, 包括全教程之家部字段的数据 + csrf token
dat长生十万年aTyp长沙市气候e: "JSON",
suc狗狗币cess: function (res) {
if (教程视频怎样制作方法res.status) {
location.href = res.data;
} else {
$.each(res.error, function (key, value) {
$("#id_" + key长沙市气候).saas服务next().输入框跑到上面了怎样办text(value[0]);
})
}
}
})
})
}
/*
点击获取验证码的按钮绑定作业
*/
fun枸杞ction bindClickBtnSms() {
$('#btnSms').click(saas是什么的简称fun宫颈癌ction () {
$('.error-msg').empty();
// 获取用户输入的手机号
// 找到输入框教程英文的ID,根据ID获取值,怎样找到手机号的saas体系哪个公司做的最好ID?
// Django ModelForm 默许生成字段ID工商银行为 “id_ + 字段名”
var mobilePhone = $('#id_mobile_phone').val();
// 发长沙市气候送ajax 央求,把手机号发送曾经
$.ajax({
url: "{% url 'send_sms' %}",  // 等价于 /send/smsaass/
type: "GET",
data: {mobile_phone: mobilePhone, tpl: "工商银行register"},  // 手机号和注册的模板
dat教程动漫人物aType: "JSON",  // 将服务端回来的数据反序列化为字典
success: function (res) {
// aja工商管理x央求发送成功之后,主动实施的函saas服务数: res便是后端回来的值
if (r枸杞es.status) {
sendSmsRemind();
} else {
// 差CSS错信息
// console.log(res);  // {status: False, error: { mobi教程的意思le_phone: ["过失信息", ] }
$.each(res.error, function (key, value) {
$("长沙市气候#id_" + key).next().text辰时是几点到几点(saas产品是什么意思啊value[0]);
})
}
}
})
})
}
/*
倒计时
*/
functi公积金on sendSmsRemind() {
var $smsBtn = $('#btnSms');
$smsBtn.prop('disabled', true);
var time = 60;
var remind = setInterval(function () {
$smsBtn.val(time + '秒从头发送');
time = time - 1;
i教程诀窍2f (time < 1) {
clearInterval(remind);
$smsBtn.val('点击获取验证码').propSaaS('disabled', false);
}
}, 1000)
}
</script>
{% endblock %}

4.2 后端

4.2.1 数据校验

  • 校验如下:
    • 用户名、邮箱、手机号在钩子函数中验证
    • 暗码经过md5加密后回来
      • md5 加密 独自封装起来,在util工程造价s文件夹中增加 encrypt教程诀窍2.py 文件

django 开发Bug追寻渠道之用户注册篇(根据腾讯云短信 & redis)|Python 主题月
– 代码如下
“`python
import uuid
import hashlib

		from django.conf import settings
def md5(stringsaas体系哪个公司做的最好):
""" MD5加密 """
hash_object = hashli龚俊b.md5(settingssaas怎样读.SECRET_KEY.encode('utf-8'))
hash_object.update(string.encode('utfsaas-8'))
return hash_object.hexdigest()
def uid(string):
data = "{}-{}".format(str(uuid.uGouid4()), string)
return md公积金5(d工商管理ata)
```
- 验证码经过redis 根据手机号(键)获取值与用户输入的进行比较【留心存在过期时间】
  • 批改 forms/account.py 文件如下:(只批改了 RegisterModelForm 类的代码,其他不变)
from utils import encrypt
class Registe输入框rModelForm(BootStrapForm, forms.Mo输入框图片delForm):
password = forms.CharField(
label='暗码',
min_length=Go8,
max_length=64,
error_messages={
'min_length': "暗码长工程造价度不能小于8个字符输入框跑到上面了怎样办",
'max_length': "暗码长度不能输入框大于64个字符"
},
widget=forms.PasswordInput())
confirm_passwsaas渠道是什么意思o输入框代码rd = forms.CharFiel陈思思d(
label='重复暗码',
min_length=8,
max_leng输入框不出来th=64,
error_messages={
'min_length': "重复暗码长度不能小于8个字符",
'googlemax_length': "重复暗码长度不能大于64个字符"
},
widget=forms.PasswordInput()
)
mobile_phone = forms.Ch工程造价arField(
label='手机号',
validators=[RegexVa教程手绘lidator(r'^(1[3|4|5|6|7|8|9])d{9}$', '手机号格局过失'), ])
code = forms.CharField(
label='验证码',
widget=forms.TextInput())
class Meta:
model = models.UserInfo
fields = ['username', 'email', 'password', 'confirm_password', 'mobile_pgooglehone', 'code']
def clean_username(self):
username = self.cleaned_data['username']
exists = models.UserI陈思思nfo.objects.filter(username=username).exists()
if exists:
raise ValidationError('用户名已存在')
# self.add_error('username', '用户名已存在')
return username
def clean_email(sel教程诀窍2电影f):
email = self.cleaned_data['email']
exists = mode狗狗币ls.UserInfo.objec长生十万年ts.filter(email=email).exists()
if ex输入框款式ist长沙市气候s:
raise ValidationError('邮箱已存在')
return email
def clean_password(self):
pwd = self.cleaned_data['password']
# 加密 & 回来
return encrypt.md5(pwd)
def clean_confirm_password(self):
# pwd = s长沙商贸旅行作业技术学院elf.cleaned_data['password']
pwd = self.cleaned_data.get('password')
confirm_pwd = encrypt.mgoogled5(self.cleaned_data['confirm_pass龚俊word'])
if pwd != confirm_pwd:
raise ValidationError('两次暗码不一致')
return confirm_pwd
def clean_mobile_phone(self):saas是什么意思啊
mobile_phone = self.cleaned_data['mobile_phone']
exists = models.UserInfo.objects.filter(mobile_phonesaas是什么的简称=mobile_phone).exi输入框不出来sts()
if exists:
raise ValidationError('手机号已注册')
return mobile_phone
def csaaslean_code(self):
code = self.cleaned_data['code']
# mobile_phone = self.cleaned_dat教程英文a['mobile_phone']
mobile_phone = self.cleaned_data.get('mobile_phone')
if not mobile_phone:
return code
conn = get_redis_connection()
redis_code = conn.get(mobile_phone)
if not red宫颈癌前期症状is_cod仓鼠寿数e:
raise ValidationEr输入框图片ror('验证码失效或未发送,请从头发送')
red长沙商贸旅行作业技术学院is_str_code = redis_code.decode('utf-8')
if code.strip() != redis_str_code:
raise ValidationError('验证码过失,请从头输入')
return code

4.2.2 写入数据库

  • 数据校验成功后,即可将在数据输入框怎样调巨细库中创立一条记录,跳转到 /login/ 页面(登录页面下一篇博文具输入框测试用例体介绍)
  • web/views/account.py 文件中Go代码批改如下:(只修saas产品是什么意思啊正了 resaas产品是什么意思啊gister 函数的内容CSS,其他不变)
def register(request):
""" 注册 """
if request.meth辰时是几点到几点od == 'saas体系是什么GET':
form = RegisterModelForm()
return render长生十万年(request, 'register.html', {'狗狗币form': form})
form = RegisterMo狗狗币delForm(data=reque输入框st.POST)
if form.is_valid():
# 验证经过,写入数据库(暗码要是密文)
# data = form.cleaned_d输入框怎样调巨细ata
# data.pop('code')
# data.pop('confirm_password')
# instance = models.UserInfo.objects.create(**data)
# save() 等同于上述代码,会主动除掉数据库中没有的数据
# 用户表中新建了一条数据(注册)
form.save()
return JsonResponse({'status': True, 'data': '/输入框跑到上面了怎样办login/'})
return JsonReCSSspons输入框跑到上面了怎样办e({'status': Fa教程lse, 'error': form.errors})