from rest_framework.decorators import permission_classes from rest_framework.parsers import MultiPartParser, FormParser from rest_framework.permissions import AllowAny from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from django.core.mail import EmailMessage import user.models # import os from utils import RandCode from django.core.cache import caches # 获取不同的缓存实例 default_cache = caches['default'] session_cache = caches['session'] celery_cache = caches['celery'] from ..models import FUser from rest_framework_simplejwt.tokens import RefreshToken from ..serializers.user_serializers import UserSerializer class SendUserEmailAPIView(APIView): permission_classes = [AllowAny] def post(self, request): to_email = request.data.get('to_email', None) print(to_email) if to_email is None or to_email == "": return Response(status=status.HTTP_400_BAD_REQUEST) if not FUser.objects.filter(email=to_email).exists(): subject = '账号注册邮件' code = RandCode.get_digit_characters_code_8() body = f"你的验证码为 {code}, 该验证码仅用于账号注册, 十分钟内有效." from_email = 'cs10086086@qq.com' default_cache.set(f"register_{to_email}", code, timeout=600) email = EmailMessage( subject=subject, body=body, from_email=from_email, to=[to_email], ) email.send() return Response('账号未注册已发送注册邮件', status=status.HTTP_201_CREATED) else: subject = "账号登录邮件" code = RandCode.get_digit_characters_code_8() body = f"你的验证码为 {code}, 该验证码仅用于账号登录, 十分钟内有效." from_email = 'cs10086086@qq.com' default_cache.set(f"login_{to_email}", code, timeout=600) email = EmailMessage( subject=subject, body=body, from_email=from_email, to=[to_email], ) email.send() return Response("邮件发送成功", status=status.HTTP_200_OK) class UserLoginOrRegisterAPIView(APIView): permission_classes = [AllowAny] def post(self, request): code = request.data.get('code', None) to_email = request.data.get('email', None) print(code, to_email) if code is None or to_email is None or code == "" or to_email == "": return Response( { "message": "参数异常" }, status=status.HTTP_400_BAD_REQUEST) user = FUser.objects.filter(email=to_email).first() print(user) print(1) if user is None: vcode = default_cache.get(f"register_{to_email}") print(1) print(vcode) if vcode is None: return Response(status=status.HTTP_400_BAD_REQUEST) print(2) if code == vcode: print(request.data) user_serializer = UserSerializer(data=request.data) if user_serializer.is_valid(): print(4) user = user_serializer.create_by_email(request.data) print(user) refresh = RefreshToken.for_user(user) return Response( { 'user': UserSerializer(user).data, 'refresh': str(refresh), 'access': str(refresh.access_token), 'token_type': 'bearer', 'expires_in': refresh.access_token.payload['exp'] - refresh.access_token.payload['iat'] }, status=status.HTTP_200_OK) else: return Response(status=status.HTTP_400_BAD_REQUEST) else: return Response(status=status.HTTP_400_BAD_REQUEST) else: vcode = default_cache.get(f"login_{to_email}") if vcode is None: return Response(status=status.HTTP_400_BAD_REQUEST) if code == vcode: user = FUser.objects.filter(email=to_email).first() refresh = RefreshToken.for_user(user) user_serializer = UserSerializer(user) return Response( { 'user': user_serializer.data, 'refresh': str(refresh), 'access': str(refresh.access_token), 'token_type': 'bearer', 'expires_in': refresh.access_token.payload['exp'] - refresh.access_token.payload['iat'] }, status=status.HTTP_200_OK, ) else: return Response(status=status.HTTP_400_BAD_REQUEST)