注册短信验证三步走

1、发送验证码模块

import json

#发送验证码
class YuanPian(object):
    def __init__(self, api_key):

        #个人在云片网的身份
        self.api_key = api_key

        #要请求的url  ======>>>>>>>>发短信
        self.single_send_url = "https://sms.yunpian.com/v2/sms/single_send.json"

    def send_sms(self,code,mobile):
        """
            apikey  string  是   是   用户唯一标识,在管理控制台获取 9b11127a9701975c734b8aee81ee3526
            mobile  string  是   是   接收的手机号,仅支持单号码发送;    15205201314
            text    string  是   是   已审核短信模板 【云片网】您的验证码是1234
            让云片网发送短信验证 我们需要传参数
            code:短信验证码
            mobile:手机号码

        """

        params = {
            "apikey":self.api_key,
            "moblie":mobile,
            "text":"[四方科技]您的验证码是{}.如过不是本人操作,请忽略此短信".format(code)
            }

        #发起一个网络请求,得到响应
        response = requests.post(self.single_send_url,data=params)

        #提示一下
        ret = json.loads(response.text)
        return ret


if __name__ == '__main__':
    #测试
    #实例化一个对象
    yun_pian = YuanPian("c60770e37f172c235b9b3c0380807108") #参数云片api_key
    yun_pian.send_sms('1314','15836540122')  #参数:验证模板、手机号

2\验证手机号模块:序列化

from LeShop import settings
from rest_framework import serializers
from datetime import datetime,timedelta
#导入用户模型
from django.contrib.auth import get_user_model
from .models import VerifyCode

User = get_user_model()
#只做验证手机号
#发送验证马的时候,她传手机号
class SmsSerializer(serializers.Serializer):
    mobile = serializers.CharField(max_length=11,label="手机号")

    #validate + 字段名字 表示用户发mobile会调用validate_mobile这个方法
    def validate_mobile(self, mobile):
        #验证方法
        #1、验证是否注册
        if User.objects.filter(mobile=mobile).count():
            raise serializers.ValidationError("用户已经注册")

        #2、验证号码正则表达式  是否真是
        if not  re.match(settings.REGEX_MOBILE,mobile):
            raise serializers.ValidationError("手机号不正确")

        #3、判断频率一分钟只能发一次
        one_minutes_ago = datetime.now() - timedelta(hours=0, minutes=1, seconds=0)

        if VerifyCode.objects.filter(add_time__gt=one_minutes_ago,mobile=mobile):
            raise serializers.ValidationError("60秒内只能发送一次")

        return mobile

3\视图模块

from  rest_framework import viewsets
# Create your views here.
from rest_framework import mixins
from .serializers import SmsSerializer
from random import choice
from rest_framework.response import Response
from rest_framework import status
from LeShop import settings
from utils.yuanpian import YuanPian
from .models import VerifyCode
class SmsCodeViewset(mixins.CreateModelMixin,viewsets.GenericViewSet):
    serializer_class = SmsSerializer     #1\只做验证手机号  #发送验证马的时候,她传手机号


    def generate_code(self):
        """
        生成四位数字的验证码
        """

        seeds = "1234567890"
        random_str = []
        for i in range(4):
            random_str.append(choice(seeds))

        return "".join(random_str)
    #重写这个方法
    #1、父类做的事情 ,很简单就存一个模型到数据库,添加一个新的数据,不满足需求
    #2、我要的事情是在弗雷德基础上
    #2、发短西验证码(随机生成数字)
    #4、发送YunPian 接收返回值 code=0是否成功
    #5、保存这个验证ma
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data) #获取序列化的类 验证手机号 SmsSerializer
        serializer.is_valid(raise_exception=True)#验证

        #可用的手机号
        yuan_pian = YuanPian(settings.APIKEY)

        #生成验证码
        code = self.generate_code()

        #validated_data拿到序列化里面的字段
        sms_status = yuan_pian.send_sms(code,mobile=serializer.validated_data["mobile"]) # 调用yuan_pian.send_sms方法发送验证码

        if sms_status['code']!=0:
            #失败
            return Response(sms_status['msg'],status=status.HTTP_400_BAD_REQUEST)
        else:
            #成功
            VerifyCode(code=code,mobile=serializer.validated_data["mobile"])
            return Response(sms_status['msg'],status=status.HTTP_201_CREATED)




        self.perform_create(serializer)#保存
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,799评论 1 32
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,792评论 0 9
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,204评论 4 61
  • 江南的风俗,棺材、衾衣,整套殓葬的对象,在人活着时就备得齐齐全全,称之为“寿材”“寿衣”,似乎是含有祝愿长命的意思...
    Sunny飞镜阅读 1,319评论 0 0
  • 01 肖柠从小学四年级开始“崛起”,从班级20名,一跃到第3名。从此,少女心中的能量就爆发了,一直到高三上学期她都...
    文艺偏执狂阅读 1,189评论 2 2