基于 Django 类的视图中的密码格式无效或未知散列算法

Posted

技术标签:

【中文标题】基于 Django 类的视图中的密码格式无效或未知散列算法【英文标题】:Invalid password format or unknown hashing algorithm in Django class based view 【发布时间】:2020-05-25 22:13:40 【问题描述】:

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

序列化器.py

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

views.py

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

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您应该在保存新用户对象之前覆盖序列化程序的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)

【讨论】:

【参考方案2】:

试试这个

from django.contrib.auth.hashers import make_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(make_password(validated_data['password']))
    user.save()
    return user

【讨论】:

以上是关于基于 Django 类的视图中的密码格式无效或未知散列算法的主要内容,如果未能解决你的问题,请参考以下文章

Django 在基于类的视图中处理多个表单

基于 Django 类的视图:了解视图类中的参数

django:DetailView 如何为两个模型工作或基于类的视图如何为两个模型工作?

基于类的视图django中的JWT验证

Django 基于类的视图中的字段派生模板名称

基于 Django 类的视图中的身份验证用户