web-dev-qa-db-ja.com

Django残りのフレームワークユーザー登録?

私はフォローしています このチュートリアル しかしこれらの問題に直面して私は修正できません:

  1. ユーザーを登録すると、パスワードが「無効なパスワード形式または不明なハッシュアルゴリズム」でハッシュされていないため、そのユーザーでAPIにログインできません。管理者で
  2. 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
13
user3149525

Set_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()
1
user3149525

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ではなく、残りのフレームワークを使用してユーザーを作成するときにパスワードがハッシュされます。

13
wsgeorge

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
6
psychok7

私は wsgeorge のソリューションを使用して独自のソリューションを構築しました。 .set_password()を使用できるように、空白のUserオブジェクトが作成されます。

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を呼び出す親クラスに任せます。

3
mathielo

モデルシリアルの作成をオーバーライドする

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
0
Emmanuel Mtali