Регистрация пользователя Django Rest Framework?
-
21-12-2019 - |
Вопрос
Я следую в
Решение 4
Обратите внимание, что Set_Password () не сохраняет объект, и, поскольку вы только что назвали Super, ваш объект уже сохранен с помощью RAW Password.
Просто используйте post_save (), чтобы сохранить пароль.
def post_save(self, obj, created=False):
"""
On creation, replace the raw password with a hashed version.
"""
if created:
obj.set_password(obj.password)
obj.save()
. Другие советы
Я попробовал принятый ответ в DRF 3.0.2, и он не работал.Пароль не был хешин.
вместо этого, переопределить метод создания в вашей модели сериализатора
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
.
Это хэши пароль, когда вы создаете пользователя, используя среду отдыха, а не post_save
Другой подход для DRF 3.x:
from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import make_password
def create(self, validated_data):
if validated_data.get('password'):
validated_data['password'] = make_password(
validated_data['password']
)
user = get_user_model().objects.create(**validated_data)
return user
. Я использовал Решение Wsgeorge для создания собственного.Пустой объект User
создается только так, чтобы я мог использовать .set_password()
:
def create(self, validated_data):
user = User()
user.set_password(validated_data['password'])
validated_data['password'] = user.password
return super(UserSerializer, self).create(validated_data)
.
отличается от его ответа, я сам не спасаю пользователя.Я оставляю это для родительского класса, вызывающего super
.
Переопределить Создание модели Serialzier
def create(self, validated_data):
if validated_data.get('password'):
validated_data['password'] = make_password(validated_data['password'])
return super(UserSerializer, self).create(validated_data)
.
Обязательно импортируйте
from django.contrib.auth.hashers import make_password
. Мы можем написать сигнал в пользователе, чтобы решить это.
def create_hash(sender, instance=None, *args, **kwargs):
passwd = instance.password
instance.set_password(passwd)
pre_save.connect(create_hash, sender=User)
.