1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- from django.shortcuts import render
- from rest_framework.exceptions import ValidationError
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework import serializers, status
- from django_redis import get_redis_connection
- from rest_framework.permissions import AllowAny
- from .models import UserInfo
- from rest_framework.authtoken.models import Token
- import random
- # Create your views here.
- import uuid
- import re
- def phone_validator(value):
- if not re.match(r'^(1[3|4|5|6|7|8|9])\d{9}$', value):
- raise ValidationError('手机格式错误')
- class LoginSerializer(serializers.Serializer):
- phone = serializers.CharField(label='手机号', validators=[phone_validator])
- code = serializers.CharField(label='短信验证码')
- def validate_code(self, value):
- if len(value) != 4:
- raise ValidationError('短信格式错误')
- if not value.isdecimal():
- raise ValidationError("短信格式错误")
- phone = self.initial_data.get('phone')
- conn = get_redis_connection()
- code = conn.get(phone)
- if not code:
- raise ValidationError("验证码过期")
- if value != code.decode('utf-8'):
- raise ValidationError("验证码错误")
- return value
- class MessageSerializer(serializers.Serializer):
- phone = serializers.CharField(label='手机号', validators=[phone_validator])
- class MessageView(APIView):
- permission_classes = [AllowAny]
- def get(self, request, *args, **kwargs):
- ser = MessageSerializer(data=request.query_params)
- if not ser.is_valid():
- return Response({'status': False, 'message': '手机号错误'})
- phone = ser.validated_data.get('phone')
- random_code = random.randint(1000, 9999)
- print(random_code)
- conn = get_redis_connection()
- conn.set(phone, random_code, ex=60)
- return Response({'status': True, 'message': '发送成功', 'code': random_code})
- class LoginView(APIView):
- permission_classes = [AllowAny]
- def post(self, request, *args, **kwargs):
- ser = LoginSerializer(data=request.data)
- if not ser.is_valid():
- return Response({'status': False, 'message': ser.errors})
- phone = ser.validated_data.get('phone')
- # 获取或创建用户
- user, created = UserInfo.objects.get_or_create(
- phone=phone,
- defaults={'username': phone} # 确保username与phone相同
- )
- # 获取或创建DRF Token
- token, _ = Token.objects.get_or_create(user=user)
- return Response({
- 'status': True,
- 'data': {
- 'token': token.key,
- 'phone': phone,
- 'id': user.id
- }
- })
|