Django-Rest-Framework:登录序列化器错误

问题描述

我正在尝试自己实现登录系统,而不是依赖第三方应用程序。尝试登录时,出现400错误的请求错误消息,提示该电子邮件用户已经存在,而不是数据,我希望它返回。

登录序列化器

class UserLoginSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = ("email","password")
        extra_kwargs = {"password": {"write_only":True}}

    def validate(self,data):
        email = data["email"]
        password = data["password"]
        user = UserProfile.objects.get(email = email)
        if user:
            if not user.check_password(data["password"]):
                raise serializers.ValidationError("Incoreect Password")
            return data
        raise serializers.ValidationError("User Not Found")

LoginAPIView

class UserLoginAPIView(APIView):

    def post(self,request):
        user = UserLoginSerializer(data = request.data)
        if user.is_valid():
            return Response(user.data,status = status.HTTP_200_OK)
        return Response(user.errors,status = status.HTTP_400_BAD_REQUEST)

models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser,PermissionsMixin,BaseUserManager
# Create your models here.

class UserProfileManager(BaseUserManager):
    
    def create_user(self,email,name,password = None):
        if not email:
            raise ValueError("No email provided")
        email = self.normalize_email(email)
        user = self.model(email = email,name = name)

        user.set_password(password)
        user.save(self._db)

        return user

    def create_superuser(self,password):
        user = self.create_user(email,password)
        user.save(self._db)

        return user


class UserProfile(AbstractBaseUser,PermissionsMixin):
    

    email = models.EmailField(unique = True)
    name = models.CharField(max_length = 120)
    objects = UserProfileManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["name"]

解决方法

由于您的序列化程序基于具有唯一User的{​​{1}}模型,因此您将收到400错误,因此验证失败。

我认为在您的情况下,使用通用的email(而不是Serializer)会更合适,因为您不使用它来保存数据以进行建模。

它将是这样的:

ModelSerializer

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...