首页 > 解决方案 > 基于 Django 类的视图中的密码格式无效或未知散列算法

问题描述

我想通过 API 视图创建用户。但我遇到了这个问题:

在此处输入图像描述

序列化程序.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'password')

视图.py

class UserRegistration(CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

我怎么解决这个问题?

标签: pythondjangoapidjango-rest-frameworkdjango-views

解决方案


您应该在保存新用户对象之前覆盖序列化程序的create()方法来散列密码。您可以set_password为此使用:

 class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'password')

    def create(self, validated_data):
        user = User(
            username=validated_data['username']
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

否则 User.password 将在 DB 中被盯着,没有散列,这是不安全的。

您也可以使用默认create_user调用set_password的方法:

 class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'password')

    def create(self, validated_data):
        return User.objects.create_user(**validated_data)

推荐阅读