143 lines
5.0 KiB
Plaintext
143 lines
5.0 KiB
Plaintext
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)
|
|
|