注册短信验证三步走
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)