Flask Mongoengine:TypeError:\uuuu init\uuuu()获取了意外的关键字参数

Flask Mongoengine:TypeError:\uuuu init\uuuu()获取了意外的关键字参数,flask,mongoengine,flask-mongoengine,Flask,Mongoengine,Flask Mongoengine,我正在使用flask mongoengine扩展,我有一个如下的用户类: 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()

我正在使用flask mongoengine扩展,我有一个如下的用户类:

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:\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

但是我正在初始化中设置密码\u散列。令人惊讶的是,如果我删除整个
\uuuu init\uuuu
并通过args传入所有内容,它就可以正常工作


所以我发现我在
\uuuu init\uuuu
中做错了什么,可能是文档超类导致的?我对此很感兴趣,非常感谢您的帮助。

这是因为当mongoengine从数据库获取数据时,它会创建类似于
用户(**数据)的实例。
(id
也可能有问题)。因此,您不需要这里的
password
参数:

{
    'id': ObjectId('51b349aef5ddaf191f2fb12f'), 
    u'email': u'test@test.test',
    u'password_hash': u'12345678123456781234567812345678'
}
尝试下一步
用户
类实现:

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)

试着降低pymongo的等级

pip install pymongo==2.8

无论发生什么情况,我都会遇到这个错误,唯一的解决方法就是将downgrande pymongo从3.0升级到2.8。

我知道你的代码发生了什么。 您应该使用uuu str_uuuuuuuuuuuuuuuuuuuu而不是使用uuuuuu init_uuuuuuuu 我也有同样的问题,现在我已经解决了。
希望我能帮助你

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


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

你是如何保存/创建新用户的?你能展示一下代码吗?