Django用户密码没有被自定义用户散列

Lys*_*aou 6 python django django-rest-framework

我目前正在为 Django 应用程序实现身份验证,我正在编写。按照 Thinkster Django 课程的代码,我实现了整个注册过程,但是我无法登录,因为在注册用户时密码没有被散列。

这是我的自定义 User 模型和create_user函数。

class UserManager(BaseUserManager)
    def create_user(self, username, email, password=None):

        if username is None:
            raise TypeError('Users must have a username.')

        if email is None:
            raise TypeError('Users must have an email address.')

        user = self.model(username=username, email=self.normalize_email(email))
        user.set_password(password)
        user.save()

        return user

    def create_superuse(self, username, email, password):
        if password is None:
            raise TypeError('Superusers must have a password.')

        user = self.create_user(username, email, password)
        user.is_superuser = True
        user.is_staff = True
        user.save()

        return user

class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(db_index=True, max_length=255, unique=True)
    email = models.EmailField(db_index=True, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = UserManager()
Run Code Online (Sandbox Code Playgroud)

如您所见,我显式调用了该set_password函数,但我找不到,为什么它没有正确执行?

My Serializer,我在其中创建用户的位置如下:

class RegistrationSerializer(serializers.ModelSerializer):

    password = serializers.CharField(
        max_length=128,
        min_length=8,
        write_only=True
    )

token = serializers.CharField(max_length=255, read_only=True)

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

    def create(self, validated_data):
        return User.objects.create_user(**validated_data)
Run Code Online (Sandbox Code Playgroud)

请注意return User.objects.create_user(**validated_data),我也尝试过,而不是return get_user_model().objects.create_user(**validated_data),因为这是另一个问题的建议,但这也不起作用。

我也发表了我的观点,以防万一有什么问题,但我真的不认为是这样。

class RegistrationAPIView(APIView):
    permission_classes = (AllowAny,)
    renderer_classes = (UserJSONRenderer,)
    serializer_class = RegistrationSerializer

    def post(self, request):
        user = request.data.get('user', {})

        serializer = self.serializer_class(data=user)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)

旁注:如果相关,我正在发送请求Postman并且我得到的所有响应似乎完全正确。但是当我浏览我的 SQLite 时,我发现密码没有经过哈希处理。这也会导致用户无法登录,因为在登录过程中,密码会被散列,然后与数据库中的密码进行比较。

旁注 2:当我通过命令行使用 注册用户时python manage.py createsuperuser,它会得到一个散列密码,一切都按我通常的预期工作。

Jan*_*lli 3

您需要在序列化程序中使用像这样的 set_password 方法:

def create(self, validated_data):
        user = User(email=validated_data['email'], username=validated_data['username'])
        user.set_password(validated_data['password'])
        user.save()
        return user
Run Code Online (Sandbox Code Playgroud)