首页 > 其他分享 >利用腾讯云和drf框架去编写一个用户注册的验证码验证

利用腾讯云和drf框架去编写一个用户注册的验证码验证

时间:2024-05-30 16:43:58浏览次数:25  
标签:code 用户注册 mobile self 验证码 import class serializer drf

一、编写利用腾讯云文件

在项目—>utils下创建一个文件tencentsms.py:

class TengXun(object):

    def send_sms(self, code, mobile):
        # 短信应用SDK AppID
        appid = APP_ID  # SDK AppID是1400开头,你们申请的appid

        # 短信应用SDK AppKey 也是你们自己的
        appkey = APP_KEY

        # 需要发送短信的手机号码
        phone_numbers = "{mobile}".format(mobile=mobile)

        # 短信模板ID,需要在短信应用中申请
        template_id = TEMPLATE_ID

        # 签名
        sms_sign = "你们自己签名的内容"  # NOTE: 这里的签名"腾讯云"只是一个示例,真实的签名需要在短信控制台中申请,另外签名参数使用的是`签名内容`,而不是`签名ID`

        ssender = SmsSingleSender(appid, appkey)
        params = ["{code}".format(code=code), "3"]  # 当模板没有参数时,`params = []`
        try:
            result = ssender.send_with_param(86, phone_numbers, template_id, params, sign=sms_sign, extend="",ext="")  # 签名参数未提供或者为空时,会使用默认签名发送短信
        except HTTPError as e:
            print(e)
        except Exception as e:
            print(e)
        print(result)
        return result

二、DRF实现用户注册

1.在settings中设置手机号的正则:

		# 手机号码正则表达式
		REGEX_MOBILE = r"^1[3-9]\d{9}$"

当然可能你也可以把腾讯云的那些内容放在自己的本地设置里面安全一点。
2.接下来写我们的数据库表,

from datetime import datetime
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    """用户"""

	    name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")
	    mobile = models.CharField(max_length=11, verbose_name="电话")
	
	    class Meta:
	        verbose_name_plural = verbose_name = "用户(CustomUser)"
	        ordering = ('id',)
	
	    def __str__(self):
	        return self.username


class VerifyCode(models.Model):
    """
    短信验证
    """
    code = models.CharField(max_length=10, verbose_name="验证码")
    mobile = models.CharField(max_length=11, verbose_name="电话")

    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")

    class Meta:
        verbose_name = "短信验证码"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.code

接着在serserializer.py中设置序列化格式,并进行检验:

import re
from rest_framework import serializers
from django.contrib.auth import authenticate
from django.contrib.auth import get_user_model
from datetime import datetime
from datetime import timedelta
from django.utils.timezone import now
from rest_framework.validators import UniqueValidator

from .models import *

from mysite.settings import REGEX_MOBILE


class CustomUserSerializer(serializers.ModelSerializer):
class Meta:
    model = CustomUser
    fields = (
        'url',
        'id',
        'username',
    )


User = get_user_model()


class SmsSerializer(serializers.Serializer):
    mobile = serializers.CharField(max_length=11)

def validate_mobile(self, mobile):
    """
    验证手机号码
    :param data:
    :return:
    """

    # 手机是否注册
    # if User.objects.filter(mobile=mobile).count() != 0:
    #     raise serializers.ValidationError("用户已经存在")

    # 验证手机号码是否合法
    if not re.match(REGEX_MOBILE, mobile):
        raise serializers.ValidationError("手机号码非法")

    # 验证发送频率
    one_min_ago = datetime.now() - timedelta(hours=0, minutes=1, seconds=0)
    if VerifyCode.objects.filter(add_time__gt=one_min_ago, mobile=mobile).count():
        raise serializers.ValidationError("距离上一次发送未超过60s")

    return mobile

3.接下来写的view函数

	# from rest_framework_jwt.serializers import jwt_payload_handler
	# from rest_framework_jwt.utils import jwt_encode_handler
	
	from .models import *
	from .serializers import *
	from common.views import CommonViewSet
	from common.permissions import IsYourself
	
	# from utils.tencentsms import send_sms_single
	
	from django.contrib.auth.backends import ModelBackend
	from django.contrib.auth import get_user_model
	from random import choice
	from rest_framework.mixins import CreateModelMixin
	from rest_framework import viewsets
	from rest_framework.response import Response
	from rest_framework import status
	
	from utils.tencentsms import TengXun
	
	
	
	
	
	class CustomUserViewSet(
	    CommonViewSet,
	    mixins.ListModelMixin,
	    mixins.RetrieveModelMixin,
	    mixins.UpdateModelMixin,
	    viewsets.GenericViewSet
	):
	    """
	    list:
	        返回所有用户
	    retrieve:
	        返回一个用户
	    update:
	        更新用户信息
	    partial_update:
	        部分更新用户信息
	    """
	
	    queryset = User.objects.all()
	    serializer_class = CustomUserSerializer
	    filter_backends = (filters.SearchFilter,)
	    search_fields = ['nickname', 'intro']
	    permission_classes_by_action = {
	        'list': [IsAuthenticated, IsYourself],
	        'retrieve': [IsAuthenticated, IsYourself],
	        'update': [IsAuthenticated, IsYourself],
	        'partial_update': [IsAuthenticated, IsYourself],
	    }
	#这是我的权限设置你们可以删除或者写上自己的
	
	class SmsCodeViewset(CreateModelMixin, viewsets.GenericViewSet):
	    """
	    发送短信验证码
	    """
	    serializer_class = SmsSerializer
	
	    def generate_code(self):
	        """
	        生成四位数字的验证码
	        :return:
	        """
	        seeds = "1234567890"
	        random_str = []
	        for i in range(4):
	            random_str.append(choice(seeds))
	        return "".join(random_str)
	
	    def create(self, request, *args, **kwargs):
	        serializer = self.get_serializer(data=request.data)
	        serializer.is_valid(raise_exception=True)
	
	        mobile = serializer.validated_data["mobile"]
	
	        teng_xun = TengXun()
	
	        code = self.generate_code()
	
	        sms_status = teng_xun.send_sms(code=code, mobile=mobile)
	
	        if sms_status["result"] != 0:
	            return Response({
	                "mobile": sms_status["errmsg"]
	            }, status=status.HTTP_400_BAD_REQUEST)
	        else:
	            code_record = VerifyCode(code=code, mobile=mobile)
	            code_record.save()
	            return Response({
	                "mobile": mobile
	            }, status=status.HTTP_201_CREATED)
	
	
	class UserViewSet(CreateModelMixin, viewsets.GenericViewSet):
	    """
	    用户
	    """
	    serializer_class = UserRegSerializer
	    queryset = User.objects.all()
	
	    # 重新定义create函数 实现注册后自动登录
	    def create(self, request, *args, **kwargs):
	        serializer = self.get_serializer(data=request.data)
	        serializer.is_valid(raise_exception=True)
	        user = self.perform_create(serializer)
	
	        re_dict = serializer.data
	
	        # 移除 token
	        re_dict.pop('token', None)
	        # 移除 name
	        re_dict.pop('name', None)
	
	        headers = self.get_success_headers(serializer.data)
	        return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
	
	    def perform_create(self, serializer):
	        return serializer.save()

这样子就可以完成短信注册的功能。当然还有写上路由,因为是我视图集的路由我就不具体展示的,怎么写路由网上的教程很多

标签:code,用户注册,mobile,self,验证码,import,class,serializer,drf
From: https://www.cnblogs.com/shenhuang/p/18222670

相关文章

  • 验证码识别,密码找回漏洞
    验证码识别,密码找回漏洞前言:本节来学习有关验证码识别以及密码找回相关的漏洞1.1基础思路用res前端判断​ 如果验证码输入后的验证结果是由后端发送res返回值给前端,然后前端根据返回值进行判​ 断,那么此时我们可以通过更改res来达到绕过验证的效果,不过如果判断是在后端,我......
  • 【DRF-08】rest-framework之解析器
    1.解析器的作用根据请求头content-type选择对应的解析器对请求体内容进行处理。有application/json,x-www-form-urlencoded,form-data等格式,可以自己自行配置支持或者不支持哪种格式,一般在实际的生产环境中用json一种数据格式进行数据交互就够了,如果需要form-data来进......
  • 【DRF-07】rest-framework之版本
    1.基于url的get传参方式(不推荐)1.1:通过自定义版本控制类,获取版本fromdjango.shortcutsimportrender,HttpResponsefromrest_framework.viewsimportAPIViewclassParamVersion(object):defdetermine_version(self,request,*args,**kwargs):version......
  • 【DRF-06】rest-framework之节流
    1.自定义节流类,基于用户IP限制访问频率1.1:自定义节流类importtimeVISIT_RECORD={}classVisitThrottle(BaseThrottle):'''#(1)取出访问者ip#(2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走#(3)循......
  • Django验证码配置与使用
    在用户注册、登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力使用验证码也是一种有效的防止crsf的方法需要安装扩展:pipinstallpillow验证码效果如下图:验证码视图新建viewsUtil.py,定义函数verifycode此段代码用到了PIL......
  • Shell编程完成用户注册登录
    目录需求1.menu界面welcome(1)注册用户(2)用户登录(3)退出2.注册用户(1)用户名(首字母大写)(2)密码(8位及其以上必须有三个字符其中一个以上如:&$_隐试密码)(3)手机号码(必须以139开头)(4)邮箱邮箱名数字开头@qq.com(5)检测是否重名,重手机号和邮箱(6)不重名、手机号、邮箱写入......
  • SpringBoot项目 制作邮箱 验证码发送(163)
     1.邮箱授权码获取邮箱--> 设置-->POP3/SMTP/IMAP-->开启服务(POP3/SMTP服务)-->授权码 开启并获取后将授权码保存下来。2.项目导入依赖<!--邮箱--><dependency><groupId>org.springframework.boot</groupId>......
  • 百度文库最新AI旋转验证码识别代码
    上个月发现百度文库最新出了一个验证码,是AI生成的。内容每次可能都不一样,所以给识别造成了很大困难。传统的比对放松完全失效。一、介绍这个是最近才出的最新验证码,内容主要以工厂、建筑、山峰、机器人、汽车、盆栽植物等为主。如下图所示优点:解决了图片种类有限的问题,AI......
  • 【DRF-05】rest-framework之权限
    1.需求:订单信息必须是SVIP用户才能查看2.基本使用2.1:models.pyfromdjango.dbimportmodelsclassUserInfo(models.Model):user_type_choices=((1,'普通用户'),(2,'VIP'),(3,'SVIP'),)user_type=models.Int......
  • Python生成随机验证码
    importrandomfromPILimportImage,ImageDraw,ImageFont,ImageFilterdefcheck_code(width=120,height=30,char_length=5,font_file='Monaco.ttf',font_size=28):code=[]"""Image.new方法用于创建一个新的图像对象。mo......