我正在使用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__
做错了什么,可能是因为文件超类?我非常坚持这一点,非常感谢你的帮助。
答案 0 :(得分:4)
尝试降级pymongo。
pip install pymongo==2.8
无论如何我都收到了这个错误,我修复它的唯一方法是将pymongo从3.0降级到2.8。
答案 1 :(得分:2)
这是因为当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)
答案 2 :(得分:0)
我知道您的代码发生了什么。 你应该使用__str__而不是使用__init __ 我有同样的问题。现在我已经解决了。 希望我能帮到你!
答案 3 :(得分:0)
我不知道为什么,但我也一直得到同样的错误,只有在将pymongo从3.0降级到2.8之后才得到修正,正如David提到的那样。
Pymongo应该发布一个解决方案,它令人沮丧,让我浪费了几个小时才意识到它。