如何在Django Rest Framework中散列Django用户密码?

Sab*_*lex 6 python authentication passwords django django-rest-framework

我正在尝试使用Django Rest Framework为我的用户注册创建一个API.我按照api-guide中的步骤创建了一个序列化程序

class CreateUserSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = ('email', 'username', 'password')
    extra_kwargs = {'password': {'write_only': True}}

  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)

但是,我继续Invalid password format or unknown hashing algorithm.为我新创建的用户获取.我试图使用make_passworddjango.contrib.auth.hashers,但我仍然无法解决这个问题.

谢谢

Tej*_*eja 16

你可以这样试试

from django.contrib.auth.hashers import make_password

user = User.objects.create(
       email=validated_data['email'],
       username=validated_data['username'],
       password = make_password(validated_data['password'])
)
Run Code Online (Sandbox Code Playgroud)


小智 7

在序列化器中重新定义函数 create :

from django.contrib.auth.hashers import make_password

class UserSerializer(ModelSerializer):

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data['password'])
        return super(UserSerializer, self).create(validated_data)
Run Code Online (Sandbox Code Playgroud)

还有这一切!:D


Tom*_*665 6

您还可以通过向序列化程序添加方法并使其返回哈希值来为该字段使用字段验证函数passwordvalidate_password

from rest_framework.serializers import ModelSerializer
from django.contrib.auth.hashers import make_password


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

    validate_password = make_password
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以在CreateAPIView中覆盖perform_create方法

from rest_framework.generics import CreateAPIView

class SignUpView(CreateAPIView):
    serializer_class = SignUpSerializers

    def perform_create(self, serializer):
        instance = serializer.save()
        instance.set_password(instance.password)
        instance.save()
Run Code Online (Sandbox Code Playgroud)