81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
|
|
from rest_framework import serializers, status, views
|
|||
|
|
from rest_framework.response import Response
|
|||
|
|
from django.contrib.auth import authenticate, get_user_model
|
|||
|
|
|
|||
|
|
User = get_user_model()
|
|||
|
|
|
|||
|
|
|
|||
|
|
class LoginSerializer(serializers.Serializer):
|
|||
|
|
username = serializers.CharField()
|
|||
|
|
password = serializers.CharField()
|
|||
|
|
|
|||
|
|
|
|||
|
|
class LoginView(views.APIView):
|
|||
|
|
def post(self, request):
|
|||
|
|
serializer = LoginSerializer(data=request.data)
|
|||
|
|
if not serializer.is_valid():
|
|||
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|||
|
|
|
|||
|
|
username = serializer.validated_data['username']
|
|||
|
|
password = serializer.validated_data['password']
|
|||
|
|
|
|||
|
|
user = authenticate(username=username, password=password)
|
|||
|
|
if not user:
|
|||
|
|
return Response(
|
|||
|
|
{'detail': '用户名或密码错误'},
|
|||
|
|
status=status.HTTP_401_UNAUTHORIZED
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 简单 Token(生产环境应该用 JWT)
|
|||
|
|
import uuid
|
|||
|
|
token = uuid.uuid4().hex
|
|||
|
|
|
|||
|
|
# 实际项目中应该存储 token 到数据库/缓存
|
|||
|
|
# 这里简化处理
|
|||
|
|
|
|||
|
|
return Response({
|
|||
|
|
'token': token,
|
|||
|
|
'user': {
|
|||
|
|
'id': user.id,
|
|||
|
|
'username': user.username,
|
|||
|
|
'email': user.email
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
|
|||
|
|
class RegisterSerializer(serializers.Serializer):
|
|||
|
|
username = serializers.CharField()
|
|||
|
|
email = serializers.EmailField()
|
|||
|
|
password = serializers.CharField()
|
|||
|
|
|
|||
|
|
|
|||
|
|
class RegisterView(views.APIView):
|
|||
|
|
def post(self, request):
|
|||
|
|
serializer = RegisterSerializer(data=request.data)
|
|||
|
|
if not serializer.is_valid():
|
|||
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
user = User.objects.create_user(
|
|||
|
|
username=serializer.validated_data['username'],
|
|||
|
|
email=serializer.validated_data['email'],
|
|||
|
|
password=serializer.validated_data['password']
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
import uuid
|
|||
|
|
token = uuid.uuid4().hex
|
|||
|
|
|
|||
|
|
return Response({
|
|||
|
|
'token': token,
|
|||
|
|
'user': {
|
|||
|
|
'id': user.id,
|
|||
|
|
'username': user.username,
|
|||
|
|
'email': user.email
|
|||
|
|
}
|
|||
|
|
}, status=status.HTTP_201_CREATED)
|
|||
|
|
except Exception as e:
|
|||
|
|
return Response(
|
|||
|
|
{'detail': str(e)},
|
|||
|
|
status=status.HTTP_400_BAD_REQUEST
|
|||
|
|
)
|