Mongoengine:TypeError:__init __()有一个意想不到的关键字参数 [英] Mongoengine: TypeError: __init__() got an unexpected keyword argument

查看:407
本文介绍了Mongoengine:TypeError:__init __()有一个意想不到的关键字参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  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)
$ b $ def __init __(self,email,password,fb_id = None,active = True):
hashp = md5.md5(密码).hexdigest()
self.email =电子邮件
self.password_hash = hashp
self.fb_id = fb_id
self.active = active

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



我得到错误:

TypeError:__init __()得到了一个意外的关键字参数'password_hash'



但是我在我的init中设置了password_hash 。令人惊讶的是,如果我删除整个 __ init __ ,并通过args传入所有内容,那么它就可以正常工作。

我在 __ init __ 中做错了,也许是文档超类的原因?这是因为当mongoengine从数据库中获取数据的时候,它会创建一个像这样的实例: 用户(**数据)(也可能存在 id 的问题)。所以你不需要 password 参数:

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

尝试下一个 User class implementation:

  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):
如果密码不为空:
data ['password_hash'] = md5.md5(密码)。 hexdigest()
super(User,self).__ init __(** data)

I有我的项目的下一个实施:

 类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,$ b $ (必须为真)

def update_password(self,password):
self .__ password_salt = get_random_string(DEFAULT_STRING_LENGTH)
self .__ password = get_hash(password + self .__ password_salt)
返回self
$ b def verify_password(self,password):
返回self .__ password == get_hash(password + self .__ password_salt)


I am using flask-mongoengine extension and I have a User class like this:

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

But when I do a simple get: User.objects.get(email = email)

I get the error:

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

but I am setting the password_hash in my init though. Surprisingly, if I delete the whole __init__ and pass in everything by args, it works fine.

So I recon I am doing something wrong in the __init__, maybe something due the document super class? I am quite stuck on this, would appreciate your help.

解决方案

This because when mongoengine get data from database then it create instance like User(**data) (there are also can be problem with id). So you haven't required password argument there:

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

Try next User class implementation:

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)

I have next implementation for my project:

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)

这篇关于Mongoengine:TypeError:__init __()有一个意想不到的关键字参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆