【DRF+Django】微信小程序入门到实战_day03(下)

 (0)摘要

# 课程链接

入门到实战,讲讲公司的微信小程序【django+drf+小程序实战】_哔哩哔哩_bilibili

# 微信开发者文档

微信开放文档

# 课程内容

(1)P28_发送短信验证码流程

(2)P29_腾讯云短信使用


(1)P28_发送短信验证码流程

# (1)验证码初步

                1)首先是布置一下前端的界面,然后我们想要把 "点击获取验证码" 注册为一个事件,具体思路就是,点击后,就会往后台发送一个 get 请求来获取验证码。

【DRF+Django】微信小程序入门到实战_day03(下)_第1张图片

                2)然后是 js 代码,注意data 处。

【DRF+Django】微信小程序入门到实战_day03(下)_第2张图片

                但是我们要获取验证码,首先要求的是必须先填入合法的手机号,所以我们需要在前面加一个判断(这只是初步判断),比如是不是输入了 11 位。如果没有输入到 11 位数的话,就会报错并且直接 return,即后续代码不执行。

【DRF+Django】微信小程序入门到实战_day03(下)_第3张图片

                3)wx.showToast(Object object) 官方api,可以理解为这个是给一个弹窗的,比如成功的弹窗、失败的弹窗、等待的弹窗等待。那么以下是相应的文档信息,详细的讲解如下:

                title:这个就是返回的弹窗中的内容,比如我们的是手机号长度错误。

                icon:是图标,默认是成功。也可以是其他值,详情可以看文档。

                image:是自定义的图标,优先级高于 icon。

                duration:就是弹窗持续的时间。

                mask:简单理解就是弹窗之后,直接让当前界面的交互失灵。

                后面的三个,和之前的是一样的。

【DRF+Django】微信小程序入门到实战_day03(下)_第4张图片


# (2)正则匹配手机格式

                1)前面我们限制了手机号的位数必须是 11 位,但是没有限制必须是数字。因为用户也可能输入各种其他字符,这是不允许的。因而可以使用 js 中的正则表达式。(当然,限制数字的话,也要限制开头是130、156等待正常的开头),具体的书写方式如下所示,当然了,对于正则表达式而言,我们还是要学会现查现用。

【DRF+Django】微信小程序入门到实战_day03(下)_第5张图片

                2)那么我们在后台的代码可以尝试获取一下

【DRF+Django】微信小程序入门到实战_day03(下)_第6张图片


# (3)基于 django 视图类的验证流程

                1)首先是明确整个流程,后台接收到前台传来的手机号,然后进行校验等等一系列步骤如下。

【DRF+Django】微信小程序入门到实战_day03(下)_第7张图片

                 

                这里需要提一下第 5 个步骤,就是发送验证码+手机号。有效期保留 30s(据说超出 30s 就要收费了),因为要存在服务器端,所以这里我们最好使用 redis 去做。redis 的一些用法如下,后续具体实践的时候我们再说。

                2)那么获取手机号就不说了,直接开始写手机号的正则校验即可。思路很简单,就是利用 re.match() 模块来做。 然后如果匹配不成功,返回的是 None,那么直接就返回手机号格式错误,当然了,这只是一种方法。

【DRF+Django】微信小程序入门到实战_day03(下)_第8张图片

                3)校验手机号还有一种实现的方法,就是使用 drf 的序列化来做。如下所示,这是继承自 serializers.Serializer 类来做的(之前用过 serializers.ModelSerializer ,但是这是需要设计相应的数据库的,显然我们的获取的号码没有存储它的数据库,所以不用这个。)

【DRF+Django】微信小程序入门到实战_day03(下)_第9张图片

                 

                4)我们应用的时候就是下面的红框的代码所示,先是实例化我们自定义序列化的类,然后传参 data=request.query_params,然后使用 ser.is_valid() 来进行校验。但是我们只是校验的规则只是检测是否为空,我们可以自定义加上校验的规则。

【DRF+Django】微信小程序入门到实战_day03(下)_第10张图片

                5)那么具体的序列化的办法就是,首先我们是定义一个校验规则,比如我们简单点,我们只是定义,写个 pass 即可。

【DRF+Django】微信小程序入门到实战_day03(下)_第11张图片

                然后验证的时候,我们在 serializers.CharField() 中添加一个 validators 属性,只要把我们自定义的校验办法添加进去即可,这是固定写法。亦即这样 serializers.CharField(label="手机号",validators=[phoneNum_validator,]) 。那么之后 ser.is_valid() 校验的时候,首先会验证字段是不是为空,然后再去使用这个序列化的校验规则,也就是执行 phoneNume_validator 这个函数。

【DRF+Django】微信小程序入门到实战_day03(下)_第12张图片

                6)结合上面的思路,我们就可以来做正则匹配了。如下所示。可以看到代码比之前的复杂了,但是我们相当于封装了一个序列化的校验规则,后续需要的时候可以复用。

【DRF+Django】微信小程序入门到实战_day03(下)_第13张图片

                7)一些细节,就是钩子函数的校验。这个钩子函数也是可以用来做校验规则的,但是整个执行流程是这样的,首先是执行默认的 label 规则(就是能不能为空),然后去执行我们自定义的序列化规则,也就是放在 serializers.CharField() 中的 validators 属性中,即下面的 phoneNum_validator(value) ,最后才是执行钩子函数 validate_phoneNum() 的内容(如果有定义的话)。【这里提一下,传参 value 就是传进来的 phoneNum 】

【DRF+Django】微信小程序入门到实战_day03(下)_第14张图片

                8)我们做一个错误数据来测试一下,可以看到返回的错误信息

【DRF+Django】微信小程序入门到实战_day03(下)_第15张图片

                9)生成随机验证码和发送验证码给用户的代码如下:

【DRF+Django】微信小程序入门到实战_day03(下)_第16张图片


# (4)基于 django 视图类的验证流程之 redis 专栏

                1)redis 的一个基本使用,或者说是构建一个 redis 的前提。其实就是一个小案例,但是这里也只是引出来。

【DRF+Django】微信小程序入门到实战_day03(下)_第17张图片

                2)但是在 django 中,给我们进一步封装了 redis 的一个模块,就是 django-redis 模块,安装直接可以用 pip 来安装。以下是使用的一个流程,暂且先了解。

【DRF+Django】微信小程序入门到实战_day03(下)_第18张图片

               

                3)安装完成 django-redis 后,要去 settings.py 去配置一下。

【DRF+Django】微信小程序入门到实战_day03(下)_第19张图片

               

                4)那么使用就是下面这样的,就记住先,后续再详解了。

【DRF+Django】微信小程序入门到实战_day03(下)_第20张图片

                5)该视图类的完整代码如下:

import re
from rest_framework import serializers

def phoneNum_validator(value):
    reg = r"^(1[3|4|5|6|7|8|9])\d{9}$"   # 这里定义一下正则的规则

    # 显然没通过就抛出一个异常
    if not re.match(reg, value):
        from rest_framework.exceptions import ValidationError       # 这是 drf 的错误,我故意放这的

        raise ValidationError("手机格式错误")
    # 如果通过了,那么默认是返回的 None


class GetCodeSerializer(serializers.Serializer):
    # 基于 serializers.Serializer 类的自定义的字段
    # label 其实默认了不能为空
    phoneNum = serializers.CharField(label="手机号", validators=[phoneNum_validator, ])

    # # 钩子函数这是定义的
    # def validate_phoneNum(self, value):
    #     pass

# 重构一个我们的代码
class GetCode(APIView):

    def get(self, request, *args, **kwargs):

        # 1. 首先要使用正则模块校验手机号,然后才能继续获取验证码
        ser = GetCodeSerializer(data=request.query_params)
        # 2. 如果校验没通过那么直接返回错误的信息
        if not ser.is_valid():

            return HttpResponse({"status": False, "msg": "手机格式错误"})

        # 3. 显然我们校验成功后,数据就放在了 ser.validated_data 中,所以我们可以通过 ser.validated_data.get() 来取得号码
        phoneNum = ser.validated_data.get("phoneNum")

        # 4. 生成验证码
        import random
        random_code = random.randint(1000, 9999)

        # 5. 然后将生成的验证码 random_code 发送到手机上面,这里需要购买相应的服务,只需要朝相应的 api 发请求就可以得到验证码了
        # 一般买的是阿里云/腾讯云的服务,前者居多,但是微信小程序自然是选择腾讯云啦。


        # 6. 保留验证码+手机号,并且保留30秒。
        # 这里我们使用 django-redis 来做
        from django_redis import get_redis_connection
        conn = get_redis_connection()   # 创建链接
        conn.set(phoneNum, random_code, ex=30)      # 保留手机号和验证码,以及保留时间 30 秒

        ret = {
            "status": True,
            "msg": "发送成功"
        }

        return JsonResponse(ret)


(2)P29_腾讯云短信使用

# (1)腾讯云短信的注册和试用

                1)首先我们打开以下的链接:短信_文本短信_通知短信_营销短信_验证码短信 - 腾讯云  ,然后就可以看到如下的界面,我们点击免费试用。

                点击了免费试用后,就会跳出如下的界面。我们首先先登录,如果是用微信登录的话,一般是要关联账户的,比如我们关联的是公众号管理平台的账户。 

                关联完成后,会要求我们勾选相应协议,和认证类型,接着就是点击接入了,我们只是用来学习,所以试用个人认证即可。

【DRF+Django】微信小程序入门到实战_day03(下)_第21张图片

                接入成功后,就是领取到了100 条免费国内短信了。 

【DRF+Django】微信小程序入门到实战_day03(下)_第22张图片

                2)在完成了上述的步骤后,我们就可以来到如下的界面。

【DRF+Django】微信小程序入门到实战_day03(下)_第23张图片


# (2)创建应用程序

                1)紧接着,我们要新建一个应用程序。如下所示,在左边的选项栏中,选择应用管理下的应用列表,然后选择创建应用。

【DRF+Django】微信小程序入门到实战_day03(下)_第24张图片

               

                2)那么我们创建好之后,只需要记住 SDK AppID 的值就可以了。

【DRF+Django】微信小程序入门到实战_day03(下)_第25张图片


# (3)签名管理【武sir 教我们避坑了】

                1)完成了应用程序的创建之后,我们就要申请签名管理了,如下图所示,先是在左侧的选项框中找到国内短信,然后选择签名管理。

【DRF+Django】微信小程序入门到实战_day03(下)_第26张图片

                2)那么点击创建签名后,就是如下的界面了,具体的信息填写和解释如下。

【DRF+Django】微信小程序入门到实战_day03(下)_第27张图片

                3)那么这一块我们需要的数据就是 ID 和签名内容,如下所示:

【DRF+Django】微信小程序入门到实战_day03(下)_第28张图片


# (4)创建正文模板

                1)我们创建完签名后,就要开始创建正文模板了,还是在国内短信下面,点击正文模板管理。这个就是我们发短信的时候显示的东西。 

【DRF+Django】微信小程序入门到实战_day03(下)_第29张图片

                2)具体的创建内容如下,然后点击确定后,就可以等待审核了,这个会比签名管理的审核容易点。

【DRF+Django】微信小程序入门到实战_day03(下)_第30张图片

                3)在正文模板这里,我们需要的数据的 ID 和模板类型。 如下所示

【DRF+Django】微信小程序入门到实战_day03(下)_第31张图片


# (5)申请腾讯云 API

                1)首先打开网址登录 - 腾讯云 ,然后会出现一个弹窗,我们选择继续使用即可。我们可以看到,左边的菜单栏变了,显然这是另一个控制台。紧接着我们点击新建密钥,就可以有以下的一串密钥,分别是 SecretId 和 SecretKey 两个,这个是我们后续调用 API 要用的。 

【DRF+Django】微信小程序入门到实战_day03(下)_第32张图片


# (6)调用相关接口去发送短信---使用腾讯的 python SDK 来做

                1)一般而言,如果某种语言没有相应的 SDK 来处理请求的传参的时候,就需要我们自己手动的去写。但是如果平台提供了对应语言的 SDK 包,那么我们就只需要考虑输出即可,相当于传参的排序和加密等等的操作对我们来说都是透明的。腾讯云的短信验证是提供了 python 的 SDK 包的,我们打开文档的链接:短信 发送短信-API 文档-文档中心-腾讯云 , 就有如下所示。【但是不推荐使用这个方法了】

【DRF+Django】微信小程序入门到实战_day03(下)_第33张图片

                2)推荐的方法。自从 API 3.0 以上后,官方是推荐如下的方式,也就是直接打开链接:短信 Python SDK-SDK 文档-文档中心-腾讯云  ,根据这个文档信息开始操作学习即可。

#

【补充知识】

# (1)python 的 re 模块

【DRF+Django】微信小程序入门到实战_day03(下)_第34张图片


#

你可能感兴趣的:(微信小程序,django)