如何解决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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。