为什么我的用户注册后无法登录?

时间:2021-04-26 18:41:49

标签: python django serialization django-rest-framework

我正在尝试验证我用户的登录请求,但我一直收到“此用户名无效”的消息。尽管我之前确实注册过。目前唯一可以登录的是admin,但我没有通过注册页面创建admin。

什么地方不起作用,我该如何解决?

这些是序列化程序:

user = get_user_model()

class UserRegistrationSerializer(serializers.ModelSerializer):

   username = serializers.CharField(
       required=True,
       validators=[UniqueValidator(queryset=User.objects.all(),lookup='iexact')]
   )

   email = serializers.CharField(
       required=True,
       validators=[UniqueValidator(queryset=User.objects.all(),lookup='iexact')]
   )

   password = serializers.CharField(
       required=True,
       label="Password",
       style={'input_type': 'password'}
   )

   password_2 = serializers.CharField(
       required=True,
       label="Confirm Password",
       style={'input_type': 'password'}
   )

   class Meta:
       model = User
       fields = ['username', 'email', 'password', 'password_2',]

   def validate_password(self, value):
       if len(value) < 8:
           raise serializers.ValidationError(
               "Password should be at least 8 characters long.")
       return value

   def validate_password_2(self, value):
       data = self.get_initial()
       password = data.get('password')
       if password != value:
           raise serializers.ValidationError("Passwords don't match.")
       return value

   def validate_username(self, value):
       if User.objects.filter(username=value).exists():
           raise serializers.ValidationError("Username already exists.")
       return value

   def create(self, validated_data):

       user = User.objects.create_user(
           username=validated_data['username'],
           password=validated_data['password'],
           email=validated_data['email']
       )

       return user




class UserLoginSerializer(serializers.ModelSerializer):

   username = serializers.CharField(
       required=True,
       write_only=True,
   )

   token = serializers.CharField(
       allow_blank=True,
       read_only=True
   )

   password = serializers.CharField(
       required=True,
       write_only=True,
       style={'input_type': 'password'}
   )

   class Meta(object):
       model = User
       fields = ['username', 'password', 'token']

   def validate(self, data):
       username = data.get('username', None)
       password = data.get('password', None)

       if not username:
           raise serializers.ValidationError("Please enter username to login.")

       user = User.objects.filter( Q(username=username))

       if user.exists() and user.count() == 1:
           user_obj = user.first()
       else:
           raise serializers.ValidationError("This username is not valid.")

       if user_obj:
           if not user_obj.check_password(password):
               raise serializers.ValidationError("Invalid credentials.")

       if user_obj.is_active:
           token, created = Token.objects.get_or_create(user=user_obj)
           data['token'] = token
       else:
           raise serializers.ValidationError("User not active.")

       return data

这是 API 视图中的错误:

{
   "non_field_errors": [
       "This username is not valid."
   ]
}

这些是视图:

User = get_user_model()

class UserLoginAPIView(generics.CreateAPIView):

   permission_classes = (permissions.AllowAny, )
   serializer_class = serializers.UserLoginSerializer
   

   def post(self, request):
       serializer = self.serializer_class(data=request.data)
       if serializer.is_valid(raise_exception=True):
           return Response(serializer.data, status=status.HTTP_200_OK)

       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

   

class UserRegistrationAPIView(generics.CreateAPIView):

   permission_classes = (permissions.AllowAny, )
   serializer_class = serializers.UserRegistrationSerializer

   def post(self, request):
       serializer = self.serializer_class(data=request.data)
       if serializer.is_valid(raise_exception=True):
           return Response(serializer.data, status=status.HTTP_200_OK)

       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

0 个答案:

没有答案