(十三)登錄註冊 邏輯一

以前咱們學瞭如何用騰訊雲發送短信redis

如今咱們要簡單說一下 有了手機號和驗證碼 怎麼進行登陸和註冊(登錄跳轉未完成)數據庫

邏輯django

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}})
後臺邏輯 沒有拆分