3

私はフラスコ モンゴエンジン拡張機能を使用しており、次のようなユーザー クラスがあります。

class User(db.Document, UserMixin):     
    email = db.StringField(max_length=120, required=True, unique=True)
    password_hash = db.StringField(max_length=80, required=True)   
    active = db.BooleanField()
    fb_id = db.StringField(max_length=120, required=False)

    def __init__(self, email, password, fb_id=None, active=True):           
        hashp = md5.md5(password).hexdigest()        
        self.email=email
        self.password_hash=hashp
        self.fb_id=fb_id
        self.active=active

しかし、単純な取得を行うと: User.objects.get(email = email)

エラーが発生します:

TypeError: __init__() got an unexpected keyword argument 'password_hash'

ただし、initでpassword_hashを設定しています。驚いたことに、全体を削除__init__してすべてを引数で渡すと、正常に動作します。

だから私は__init__、ドキュメントのスーパークラスが原因で何か間違ったことをしていると思いますか? 私はこれにかなりこだわっています。助けていただければ幸いです。

4

4 に答える 4

5

pymongo をダウングレードしてみてください。

pip install pymongo==2.8

何があってもこのエラーが発生し、それを修正する唯一の方法は、pymongo を 3.0 から 2.8 にダウングレードすることでした。

于 2015-04-12T20:04:19.467 に答える
3

これは、mongoengine がデータベースからデータを取得するときに、次のようなインスタンスを作成するためですUser(**data)( id. passwordしたがって、そこに引数は必要ありません。

{
    'id': ObjectId('51b349aef5ddaf191f2fb12f'), 
    u'email': u'test@test.test',
    u'password_hash': u'12345678123456781234567812345678'
}

次のUserクラスの実装を試してください:

class User(db.Document, UserMixin):
    email = db.StringField(max_length=120, required=True, unique=True)
    password_hash = db.StringField(max_length=80, required=True)
    active = db.BooleanField()
    fb_id = db.StringField(max_length=120, required=False)

    def __init__(self, password=None, **data):
        if password is not None:
            data['password_hash'] = md5.md5(password).hexdigest()
        super(User, self).__init__(**data)

私のプロジェクトには次の実装があります。

class User(db.Document, UserMixin):
    email = EmailField(unique=True, max_length=64, required=True)
    __password = StringField(db_field='password',
                             min_length=HASH_HEX_STRING_LENGTH,
                             max_length=HASH_HEX_STRING_LENGTH,
                             required=True)
    __password_salt = StringField(db_field='password_salt',
                                  min_length=DEFAULT_STRING_LENGTH,
                                  max_length=DEFAULT_STRING_LENGTH,
                                  required=True)

    def update_password(self, password):
        self.__password_salt = get_random_string(DEFAULT_STRING_LENGTH)
        self.__password = get_hash(password + self.__password_salt)
        return self

    def verify_password(self, password):
        return self.__password == get_hash(password + self.__password_salt)
于 2013-06-08T15:29:08.470 に答える
0

理由はわかりませんが、同じエラーが発生し続け、pymongoを3.0から2.8にダウングレードした後にのみ、Davidが言及したように修正されました。

Pymongo はその修正を公開する必要がありますが、イライラするので、気付くまでに数時間を無駄にしました。

于 2015-08-28T08:35:15.113 に答える
0

あなたのコードで何が起こったのか知っています。 __init__ を使用する代わりに __str__ を使用する必要があります 。私は同じ問題を抱えています。今解決しました。私があなたを助けることができることを願っています!

于 2015-08-18T03:21:42.590 に答える