3

我正在使用 flask-mongoengine 扩展,并且我有一个这样的 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, 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__并通过 args 传递所有内容,它工作正常。

所以我发现我在 中做错了什么__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

我知道你的代码发生了什么。 你应该使用 __str__ 而不是使用 __init__ 我有同样的问题。现在我已经解决了。希望我能帮助你!

于 2015-08-18T03:21:42.590 回答
0

我不知道为什么,但我也一直遇到同样的错误,只有在将 pymongo 从 3.0 降级到 2.8 后,它才得到修复,正如 David 所说。

Pymongo 应该为此发布一个修复程序,这令人沮丧,让我浪费了几个小时才意识到这一点。

于 2015-08-28T08:35:15.113 回答