zoukankan      html  css  js  c++  java
  • (十三)登陆注册 逻辑一

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

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

    逻辑

    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}})
    后台逻辑 没有拆分

  • 相关阅读:
    史上最全的网银转账测试分析与设计
    【面试题】你是测试工程师,如何保证软件的质量?
    小白成长建议--小白如何提问
    [感悟]性能测试测什么
    通过一个简单的数据库操作类了解PHP链式操作的实现
    PHP魔术方法小结.md
    谈PHP中信息加密技术
    PHP输入流php://input [转]
    【PHPsocket编程专题(实战篇③)】构建基于socket的HTTP请求类
    从一次面试经历谈PHP的普通传值与引用传值以及unset
  • 原文地址:https://www.cnblogs.com/a438842265/p/12371259.html
Copyright © 2011-2022 走看看