1 在GeneralTools目录下创建一个常量文件Constants.py

  获取短信验证之前需要申请腾讯云短信服务。

"""
    腾讯云短信相关常量
"""
# 云短信应用 SDK AppID
SMS_SDK_APP_ID = ''

# 云短信应用 SDK AppKey
SMS_APP_KEY = ''

# 注册短信模板ID
SMS_REGISTER_TEMPLATE_ID = # 输入模板编号

# 短信签名,签名参数使用的是`签名内容`,而不是`签名ID`。
SMS_SIGN = ''

# 验证access_token有效时间: s
VERIFY_ACCESS_TOKEN_EXPIRES = 300

# 短信验证码的有效期,单位秒
SMS_CODE_REDIS_EXPIRES = 300

# 短信验证码发送间隔,单位秒
SEND_SMS_CODE_INTERVAL = 60

2 GeneralTools目录下创建文件CustomSchema.py

  在接口文档中,需要对GET参数进行备注。如图:

  此时,需要编写一个公共类,用于在每个视图中增加备注。内容如下:

from rest_framework.schemas import AutoSchema

class CustomSchema(AutoSchema):
    """
    自定义AutoSchema,为view手动添加注释
    """

    def get_manual_fields(self, path, method):
        """
        location有下列可选选项可以选:
        path 包含在模板化URI中。例如,url值/products/{product_code}/可以与"path"字段一起使用。
        query 包含在URL查询参数中。例如?search=sale。通常用于GET请求。
        form 包含在请求正文中,作为JSON对象或HTML表单的单个项目。例如{"colour": "blue", ...}。通常的POST,PUT和PATCH请求。"form"单个链接上可以包含多个字段。
        header 包含在请求头中,可以自定义。
        {
            'get': [
                coreapi.Field(name="mobile", required=True, location="path", schema=coreschema.String(description='手机号')),
                coreapi.Field(name="name", required=True, location="query", schema=coreschema.String(description='用户名')),
                coreapi.Field(name="password", required=True, location="query", schema=coreschema.String(description='密码')),
            ],
            'post': [
                coreapi.Field(name="mobile", required=True, location="path", schema=coreschema.String(description='手机号')),
                coreapi.Field(name="subject", required=True, location="query", schema=coreschema.String(description='邮件主题')),
                coreapi.Field(name="message", required=True, location="query", schema=coreschema.String(description='邮件正文')),
                coreapi.Field(name="to_email", required=True, location="query", schema=coreschema.String(description='收件人')),
            ],
        }
        """

        # 可能是list,也可能是dict
        manual_fields = super(CustomSchema, self).get_manual_fields(path, method)

        if type(manual_fields) == list:
            return manual_fields
        else:
            # dict
            for k, v in self._manual_fields.items():
                if method.lower() == k.lower():
                    return v
            else:
                return []

  使用方法则是在调用的类中,最前面做声明,声明格式如下:

schema = CustomSchema(
        manual_fields={
            'get': [
                Field(name="mobile", required=True, location="query", schema=String(description='手机号')),
            ],
        }
    )

3 在GeneralTools下创建一个用于正则表达式验证的公共方法,名为:Verifications.py 在其中增加一个手机验证方法。

import re

def mobileVerify(mobile):
    if re.match(r'^1[3-9]\d{9}$', mobile):
        return True
    return False

4 在APP下views目录下创建Register.py文件,内容如下:

from rest_framework.views import APIView
import logging
from itsdangerous import TimedJSONWebSignatureSerializer as TJWSSerializer
from django.conf import settings
from rest_framework.response import Response
from rest_framework import status

from coreapi import Field
from coreschema import String
from GeneralTools.CustomSchema import CustomSchema
from GeneralTools import Constants
from GeneralTools import Verifications

logger = logging.getLogger('tongheng2')

class GetRegisterToken(APIView):
    """
    用户注册第一步:获取短信接口access token
    """

    schema = CustomSchema(
        manual_fields={
            'get': [
                Field(name="mobile", required=True, location="query", schema=String(description='手机号')),
            ],
        }
    )

    @classmethod
    def get(cls, request):
        """
        【功能描述】用户注册第一步:获取短信接口access token </br>
        【返回值】返回短信接口access token </br>
        """

        mobile = request.query_params.get('mobile')
        if not mobile:
            return Response(data={'message': '缺少mobile参数'}, status=status.HTTP_400_BAD_REQUEST)

        if not Verifications.mobileVerify(mobile):
            return Response(data={'message': '不是有效的有机号'}, status=status.HTTP_400_BAD_REQUEST)
        # 创建itsdangerous模型的转换工具
        tjwserializer = TJWSSerializer(settings.SECRET_KEY, Constants.VERIFY_ACCESS_TOKEN_EXPIRES)
        access_token = tjwserializer.dumps({'mobile': mobile})  # bytes
        access_token = access_token.decode()  # str

        data = {
            'mobile': mobile,
            'access_token': access_token
        }
        return Response(data=data, status=status.HTTP_200_OK)

5 配置Organization urls

from django.urls import path
from .views import Register

urlpatterns = [
    path('GetRegisterToken/', Register.GetRegisterToken.as_view()),
]

6 运行工程,进入接口文档,可以看到以下效果

7 点击Interact,即可进行接口测试,即输入手机号,获取获取短信接口access token

0009 注册登录(第二步:获取短信接口access token)的更多相关文章

  1. Flask实战第42天:注册页面对接短信接口及接口加密

    我们来看下之前写的 sms_captcha函数 @bp.route('/sms_captcha/') def sms_captcha(): params = {'code':'abcd'} resul ...

  2. python+pymssql+selenium 获取短信验证码登录(实战练习)

    登录页面输入手机号, 获取短信验证码(验证码有10分钟有效期) 1 连接sql server数据库,获取10分钟之内的有效短信验证码 2 页面输入手机号,并获取验证码.若存在有效验证码则输入验证码,若 ...

  3. 重构客户注册-基于ActiveMQ实现短信验证码生产者

    重构目标:将bos_fore项目中的CustomerAction作为短信消息生产者,将消息发给ActiveMQ,创建一个单独的SMS项目,作为短信息的消费者,从ActiveMQ获取短信消息,调用第三方 ...

  4. 移动端获取短信验证码java实现——阿里云短信服务

    需求:移动端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短信 ...

  5. 浏览器端获取短信验证码java实现——阿里云短信服务

    需求:浏览器端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短 ...

  6. 转载:Android自动化测试- 自动获取短信验证码

    前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android ...

  7. android自动获取短信验证码

    前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码.主要就是实时获取短信信息.android上获 ...

  8. 短信接口调用以及ajax发送短信接口实现以及前端样式

    我们短信api用的是云信使平台提供的非免费短信服务:官网提供的demo有两种,分别是function加其调用.class文件加其调用. 在这里我们用class文件加调用: 首先,ThinkPHP里面自 ...

  9. Thinkphp框架 -- 短信接口验证码

    我用的是一款名叫 短信宝 的应用,新注册的用户可以免费3条测试短信,发现一个BUG,同个手机可以无限注册,自己玩玩还是可以的. 里面的短信接口代码什么信息都没有,感觉看得不是很明白,自己测试了一遍,可 ...

随机推荐

  1. 线段树区间染色 ZOJ 1610

    Count the Colors ZOJ - 1610 传送门 线段树区间染色求染色的片段数 #include <cstdio> #include <iostream> #in ...

  2. [SDOI2018]反回文串

    题意 问有多少个长度为\(N\)且字符集大小为\(K\)的字符串可以通过回文串旋转 (把第一个字符移到最后)若干次得到.\(K\le N≤10^{18}\) 做法 ARC64F的加强版 设\(h(d) ...

  3. SSH自动断开后重连的解决方案

    注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/ssh-conn ...

  4. 使用ASP.NET Core 3.x 构建 RESTful API - 5.1 输入验证

    说到验证,那就需要做三件事: 定义验证规则 按验证规则进行检查 报告验证的错误.在把错误报告给API消费者的时候,报告里并不包含到底是服务端还是API消费者引起的错误,这是状态码的工作.而通常响应的B ...

  5. java使用原生MySQL实现数据的增删改查以及数据库连接池技术

    一.工具类及配置文件准备工作 1.1 引入jar包 使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下: <dependency> <groupId> ...

  6. 【pycharm基本操作】项目创建、切换、运行、字体颜色设置,常见包的安装步骤

    创建新项目 退出项目 怎样区别虚拟环境和系统环境? 虚拟环境和系统环境切换:进入项目切换解释器 切换项目 创建python目录和文件 代码运行方式一: 还可以这样执行代码方式二: 文件的剪切.复制.删 ...

  7. 使用 VMware Workstation Pro 安装新的虚拟机

     一.连接服务器 (1)“文件”右键 (2)输入用户名.密码连接服务器 二.创建新的虚拟机 (1) (2) (3) (4) (5) (6) (7) (8)  三.配置服务器 配置文档 - 链接:htt ...

  8. 通过 Chrome浏览器 查看http请求报文

    as we all know  HTTP 请求报文 包含请求行.请求头和请求体三部分 请求行:(请求方式 资源路径 协议/版本) 例如:POST /test/index.html HTTP/1.1 P ...

  9. Visual Studio 2017中使用gulp编译sass/scss

    在Visual Studio 2017中使用gulp编译sass/scss文件 需要的环境:Visual Studio 2017.Node.js.npm 在vs2017中 [视图]-[其他窗口]-[任 ...

  10. HTML5创建高德地图

    创建高德地图 功能真的很好很强大,有图有证据! 1.申请key值 去官网2.https://webapi.amap.com/maps?v=1.4.11&key=e22196035aaa10db ...