基于 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 类的视图中的密码格式无效或未知散列算法的主要内容,如果未能解决你的问题,请参考以下文章