views.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from django.shortcuts import render
  2. from rest_framework.exceptions import ValidationError
  3. from rest_framework.views import APIView
  4. from rest_framework.response import Response
  5. from rest_framework import serializers, status
  6. from django_redis import get_redis_connection
  7. from rest_framework.permissions import AllowAny
  8. from .models import UserInfo
  9. from rest_framework.authtoken.models import Token
  10. import random
  11. # Create your views here.
  12. import uuid
  13. import re
  14. def phone_validator(value):
  15. if not re.match(r'^(1[3|4|5|6|7|8|9])\d{9}$', value):
  16. raise ValidationError('手机格式错误')
  17. class LoginSerializer(serializers.Serializer):
  18. phone = serializers.CharField(label='手机号', validators=[phone_validator])
  19. code = serializers.CharField(label='短信验证码')
  20. def validate_code(self, value):
  21. if len(value) != 4:
  22. raise ValidationError('短信格式错误')
  23. if not value.isdecimal():
  24. raise ValidationError("短信格式错误")
  25. phone = self.initial_data.get('phone')
  26. conn = get_redis_connection()
  27. code = conn.get(phone)
  28. if not code:
  29. raise ValidationError("验证码过期")
  30. if value != code.decode('utf-8'):
  31. raise ValidationError("验证码错误")
  32. return value
  33. class MessageSerializer(serializers.Serializer):
  34. phone = serializers.CharField(label='手机号', validators=[phone_validator])
  35. class MessageView(APIView):
  36. permission_classes = [AllowAny]
  37. def get(self, request, *args, **kwargs):
  38. ser = MessageSerializer(data=request.query_params)
  39. if not ser.is_valid():
  40. return Response({'status': False, 'message': '手机号错误'})
  41. phone = ser.validated_data.get('phone')
  42. random_code = random.randint(1000, 9999)
  43. print(random_code)
  44. conn = get_redis_connection()
  45. conn.set(phone, random_code, ex=60)
  46. return Response({'status': True, 'message': '发送成功', 'code': random_code})
  47. class LoginView(APIView):
  48. permission_classes = [AllowAny]
  49. def post(self, request, *args, **kwargs):
  50. ser = LoginSerializer(data=request.data)
  51. if not ser.is_valid():
  52. return Response({'status': False, 'message': ser.errors})
  53. phone = ser.validated_data.get('phone')
  54. # 获取或创建用户
  55. user, created = UserInfo.objects.get_or_create(
  56. phone=phone,
  57. defaults={'username': phone} # 确保username与phone相同
  58. )
  59. # 获取或创建DRF Token
  60. token, _ = Token.objects.get_or_create(user=user)
  61. return Response({
  62. 'status': True,
  63. 'data': {
  64. 'token': token.key,
  65. 'phone': phone,
  66. 'id': user.id
  67. }
  68. })