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