Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UserManager中的Django set_password()方法正在保存纯文本_Python_Django_Django Rest Framework_Django Views_Django Serializer - Fatal编程技术网

Python UserManager中的Django set_password()方法正在保存纯文本

Python UserManager中的Django set_password()方法正在保存纯文本,python,django,django-rest-framework,django-views,django-serializer,Python,Django,Django Rest Framework,Django Views,Django Serializer,我正在尝试为注册创建一个端点。 当我创建一个新用户时,密码字段中将保存一个纯文本。但是,当我通过admin添加用户时,它会被散列。我不确定我错过了什么 model.py class UserManager(BaseUserManager): def _create_user(self, email, password=None, **extra_fields): if not email: raise ValueError('The given email must be

我正在尝试为注册创建一个端点。 当我创建一个新用户时,密码字段中将保存一个纯文本。但是,当我通过admin添加用户时,它会被散列。我不确定我错过了什么

model.py

class UserManager(BaseUserManager):
def _create_user(self, email, password=None, **extra_fields):
    if not email:
        raise ValueError('The given email must be set')

    user = self.model(
        email=self.normalize_email(email),
        **extra_fields,
    )
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_user(self, email, password=None, **extra_fields):
    extra_fields.setdefault('is_superuser', False)
    return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_admin', True)
    extra_fields.setdefault('is_superuser', True)

    if extra_fields.get('is_superuser') is not True:
        raise ValueError('Superuser must have is_superuser=True.')

    return self._create_user(email, password, **extra_fields)
序列化程序.py

from rest_framework import serializers
from django.contrib.auth import authenticate
from .models import User
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
    model = User
    fields = ('email', 'password')
    extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = User.objects.create_user(
            validated_data['email'],
            validated_data['password']
        )
        return user
view.py

class RegisterAPI(generics.GenericAPIView):
serializer_class = RegisterSerializer

def post(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.save()
    return Response({
        "user": UserSerializer(user, context=self.get_serializer_context()).data,
    })

问题出现在注册表序列化程序中。创建方法:

def create(self, data):
    user = User.objects.create(**data)
    return user
您将用户的
密码作为文本,并调用
user.objects.create
来创建
user
实例。
UserManager
create
方法(最终委托给
QuerySet
)是通用的,这意味着
password
字段将按原样填充为输入数据,而不进行任何散列

由于它是以明文形式保存的,Django无法确定它保存的格式(典型的格式是
hash\u algo$iterations$salt$hash
),因此它无法从中找到散列算法salt,hash;因此,该错误导致密码格式无效或哈希算法未知

UserManager
公开了方法
create\u user
为了通过传递纯文本密码并在那里执行所有这些操作来创建用户,您应该利用:

def create(self, data):
    user = User.objects.create_user(**data)
    #                   ^^^^ Here
    return user

或者您可以直接在序列化程序中的用户实例上使用
set\u password
,但正如您可以轻松使用
create\u user
一样,您应该使用它。

我将其更改为create\u user(),但它仍然给我相同的错误:(@user8229795通过API创建一个新用户并使用该用户登录。并从数据库更新所有现有用户以设置正确的密码(使用
set\u password
)。我删除了数据库和迁移,但仍然不起作用。感谢您抽出时间。@user8229795请编辑您的问题并添加您现在得到的完整回溯。我编辑了我的问题。创建数据库时没有错误,但检查数据库时,它没有哈希。