我的登录 API 端点有问题,上次我检查时它正在工作,现在盲目工作几个小时后它不再工作了,我不知道我做了什么:)
注册工作顺利,用户也在数据库中创建并在管理面板中可见。 相同的凭据不适用于登录。 我已经发布了下面的代码,提前感谢您的帮助
views.py
#register new users
@api_view(['POST'])
def register_user(request):
if request.method == 'POST':
serializer = UserSerializer(data= request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.data,status=status.HTTP_400_BAD_REQUEST)
#userlogin with authentication tokens
@api_view(['POST'])
def user_login(request):
if request.method == 'POST':
email = request.data.get('email')
password = request.data.get('password')
user = None
if not user:
user = authenticate(email = email, password=password)
if user:
#token creation for the logged in user
token, _ = Token.objects.get_or_create(user=user)
return Response(user.getDetails(), status=status.HTTP_200_OK) # type: ignore
return Response({'error': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED)
模型.py
class CustomUser(AbstractUser):
# username = models.CharField(max_length = 25 ,default = 'No name',unique = True)
username = None
email = models.EmailField(default ="no email",unique = True)
first_name = models.CharField(max_length = 25 ,default = 'No name')
last_name = models.CharField(max_length = 25, default = 'No surname')
password = models.CharField(max_length = 25,default = "no password")
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
def getDetails(self):
return {
'email': self.email,
'first_name': self.first_name,
'last_name': self.last_name
}
序列化器.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = ['id','email','password','first_name','last_name']
extra_kwargs = {'password': {'write_only': True}}
尝试使用与注册过程相同的凭据登录用户
请为登录过程创建一个序列化程序,如下所示:
class LoginSerializer(serializer.Serializer):
password = serializers.CharField()
email = serializers.EmailField()
当然你需要一个像这样的 CustomUserSerialzier :
class CustomUserSerializer(serializers.ModelSerializer):
"""
Serializer class to serialize CustomUser model.
"""
class Meta:
model = User
fields = ("email", "first_name", "last_name", "id",)
并在你的views.py中更改登录过程,如下所示:
class UserLoginAPIView(generics.GenericAPIView):
"""
An endpoint to authenticate existing users using their email and password.
"""
permission_classes = (permissions.AllowAny,)
serializer_class = LoginUserSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data
serializer = CustomUserSerializer(user)
token = tokens.RefreshToken.for_user(user)
data = serializer.data
data["tokens"] = {"refresh": str(token), "access": str(token.access_token)}
return response.Response(data, status=status.HTTP_200_OK)
希望有帮助。