flask mongoengine flask-mongoengine

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.