flask - Mongoengine: TypeError:__init__() obtuvo un argumento de palabra clave inesperado
flask-mongoengine (4)
Estoy usando la extensión flask-mongoengine y tengo una clase de usuario como esta:
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
Pero cuando hago un simple get: User.objects.get(email = email)
Me sale el error:
TypeError: __init__() got an unexpected keyword argument ''password_hash''
pero estoy configurando el password_hash en mi init sin embargo. Sorprendentemente, si borro todo el __init__
y paso todo por args, funciona bien.
Así que reconozco que estoy haciendo algo mal en el __init__
, tal vez algo debido a la __init__
documentos. Estoy bastante atrapado en esto, agradecería su ayuda.
Sé lo que pasó en tu código. deberías usar __str__ en lugar de usar __init__. Tengo el mismo problema. Ahora que lo he resuelto. ¡Espero poder ayudarte!
Esto porque cuando mongoengine obtiene datos de la base de datos, crea una instancia como User(**data)
(también puede haber problemas con la id
). Entonces no ha requerido un argumento de password
allí:
{
''id'': ObjectId(''51b349aef5ddaf191f2fb12f''),
u''email'': u''[email protected]'',
u''password_hash'': u''12345678123456781234567812345678''
}
Pruebe la siguiente implementación de la clase de 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)
Tengo la siguiente implementación para mi proyecto:
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)
Prueba a degradar Pymongo.
pip install pymongo==2.8
Obtuve este error sin importar nada y la única forma en que lo arreglé fue bajar el Pymongo de 3.0 a 2.8.
No sé por qué, pero también seguí recibiendo el mismo error y solo después de degradar Pymongo de 3.0 a 2.8 se solucionó como mencionó David.
Pymongo debería publicar una solución para eso, es frustrante y me hizo perder un par de horas antes de darme cuenta.