(十三)登陆注册 逻辑一

之前我们学了如何用腾讯云发送短信

现在我们要简单说一下 有了手机号和验证码 怎么进行登录和注册(登陆跳转未完成)

逻辑

1. 校验手机号是否合法
2. 校验验证码 redis
   - 无验证码
   - 有验证码 输入错误
   - 有验证码 输入成功
3. 去数据库中获取用户信息(获取/创建)
4. 将一些信息返回给小程序

小程序端 我们现在假设已经输入了手机号和验证码

 

 

 

 

复制代码
import uuid
from rest_framework.exceptions import ValidationError
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from django_redis import get_redis_connection
from app01 import models
class LoginSerializer(serializers.Serializer):
    phone = serializers.CharField(label="手机号", validators=[phone_validator, ])
    code = serializers.CharField(label="验证码")

    def validate_code(self, value):
        '''
        校验验证码
        :param value:
        :return:
        '''
        if len(value) != 4:
            raise ValidationError('短信格式错误')
        if not value.isdecimal():
            raise ValidationError('短信格式错误')

        '''
        initial_data 在这样必须用 initial_data相当于request.data 
        对比一下 is_valid中validated_data
        '''
        phone = self.initial_data.get('phone')
        # code验证
        conn = get_redis_connection()
        code = conn.get(phone)
        if not code:
            raise ValidationError('验证码过期')
        if value != code.decode('utf-8'):
            raise ValidationError('验证码过期')
        return value


class LoginView(APIView):
    def post(self, request, *args, **kwargs):
        print(request.data)
        '''
        1. 校验手机号是否合法
        2. 校验验证码 redis
            - 无验证码
            - 有验证码 输入错误
            - 有验证码 输入成功
        3. 去数据库中获取用户信息(获取/创建)
        4. 将一些信息返回给小程序
        '''
        ser = LoginSerializer(data=request.data)
        if not ser.is_valid():
            return Response({"status": False, 'message': '验证码错误'})

        phone = ser.validated_data.get('phone')
        ''' 
        user = models.UserInfo.objects.filter(phone=phone).first()
        if not user:
            models.UserInfo.objects.create(phone=phone,token=str(uuid.uuid4()))
        else:
            user.token = uuid.uuid4()
            user.save()
        '''
        user_object, flag = models.UserInfo.objects.get_or_create(phone=phone)
        user_object.token = str(uuid.uuid4())
        user_object.save()
        return Response({"status": True, 'data':{'phone':phone,'token':user_object.token}})
后台逻辑 没有拆分
复制代码

 

 

 

posted @   流年中渲染了微笑  阅读(238)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示