注册短信验证三步走

2019-03-06  本文已影响0人  dream_seeker

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)
上一篇下一篇

猜你喜欢

热点阅读