首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__init__:Mongoengine: Mongoengine

__init__:Mongoengine: Mongoengine
EN

Stack Overflow用户
提问于 2013-06-07 17:56:51
回答 4查看 5.3K关注 0票数 3

我正在使用flask-mongoengine扩展,我有一个User类,如下所示:

代码语言:javascript
复制
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

但是当我执行一个简单的get时:User.objects.get(email = email)

我得到了错误:

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

但是我在我的初始化中设置了password_hash。令人惊讶的是,如果我删除整个__init__并通过args传入所有内容,它会工作得很好。

所以我认为我在__init__中做错了什么,也许是由于文档超类的原因?我被困在这个问题上了,非常感谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-08 23:29:08

这是因为当mongoengine从数据库中获取数据时,它会像User(**data)一样创建实例(id也会有问题)。所以这里不需要password参数:

代码语言:javascript
复制
{
    'id': ObjectId('51b349aef5ddaf191f2fb12f'), 
    u'email': u'test@test.test',
    u'password_hash': u'12345678123456781234567812345678'
}

尝试下一个User类实现:

代码语言:javascript
复制
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)

我有我的项目的下一个实现:

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2015-04-13 04:04:19

尝试降级pymongo。

代码语言:javascript
复制
pip install pymongo==2.8

不管怎样,我都得到了这个错误,我修复它的唯一方法是将pymongo从3.0降级到2.8。

票数 5
EN

Stack Overflow用户

发布于 2015-08-18 11:21:43

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16981268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档