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 } })