Django RESTフレームワークのユーザー登録?
-
21-12-2019 - |
質問
続いていますこのチュートリアルがこれらの問題に直面しています。
- ユーザーを登録すると、パスワードがハッシュされていないため、そのユーザーにログインすることはできません。 「無効なパスワードフォーマットまたは不明なハッシュアルゴリズム」admin
- API にログインしていない場合は、「API / Accounts」に投稿することも、閲覧可能なAPIの形式を参照することもできません。
私のコード:
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('password', 'first_name', 'last_name', 'email')
write_only_fields = ('password',)
def restore_object(self, attrs, instance=None):
# call set_password on user object. Without this
# the password will be stored in plain text.
user = super(UserSerializer, self).restore_object(attrs, instance)
user.set_password(attrs['password']) #somehow not hashing
return user
.解決 4
set_password()がオブジェクトを保存しないので、スーパーが最初に呼び出されたので、オブジェクトは既にRAWパスワードで保存されています。
パスワードを保存するには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で受け入れられた答えを試してみました。パスワードはハッシュされていませんでした。
代わりに、モデルシリアライザのCREATEメソッドをオーバーライドします
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
ではなく、RESTフレームワークを使用してユーザーを作成するとパスワードをハッシュします。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
を呼び出す親クラスに残ります。
Model Sirrazier
の作成作成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)
. 所属していません StackOverflow