El paquete bcrypt de Python en Heroku le da a AttributeError: el objeto ‘módulo’ no tiene ningún atributo ‘ffi’

Tengo un problema al utilizar bcrypt con mi aplicación Flask en Heroku. Cuando implemento en Heroku y voy a la ruta de inicio de sesión, obtengo 500 errores internos del servidor. Funciona correctamente localmente. ¿Cómo consigo que el paquete bcrypt funcione en Heroku?

ERROR in app: Exception on /login [POST] Traceback (most recent call last): File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request rv = self.dispatch_request() File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/app/.heroku/python/lib/python2.7/site-packages/flask_restful/__init__.py", line 477, in wrapper resp = resource(*args, **kwargs) File "/app/.heroku/python/lib/python2.7/site-packages/flask/views.py", line 84, in view return self.dispatch_request(*args, **kwargs) File "/app/.heroku/python/lib/python2.7/site-packages/flask_restful/__init__.py", line 587, in dispatch_request resp = meth(*args, **kwargs) File "/app/app.py", line 196, in post elif bcrypt.check_password_hash(user.password, password): File "/app/.heroku/python/lib/python2.7/site-packages/flask_bcrypt.py", line 193, in check_password_hash return safe_str_cmp(bcrypt.hashpw(password, pw_hash), pw_hash) File "/app/.heroku/python/lib/python2.7/site-packages/bcrypt/__init__.py", line 82, in hashpw hashed = _bcrypt.ffi.new("char[]", 128) AttributeError: 'module' object has no attribute 'ffi' 

Me encontré con un problema similar. Aquí está una copia de la última parte de mi seguimiento de stack:

  self.password = User.hashed_password(password) File "/app/application/models.py", line 16, in hashed_password File "/app/.heroku/python/lib/python3.5/site-packages/flask_bcrypt.py", line 163, in generate_password_hash File "/app/.heroku/python/lib/python3.5/site-packages/bcrypt/__init__.py", line 50, in gensalt output = _bcrypt.ffi.new("unsigned char[]", 30) AttributeError: module 'bcrypt._bcrypt' has no attribute 'ffi' 

Me pregunto si este problema es particular de Heroku. Estaba usando una placa de matrícula Flask existente. Pero este problema con Bcrypt también me ha sucedido en proyectos anteriores cuando utilizaba un (FASK) (diferente) proyecto Flask en Heroku.

Posible solución 1

Juega con diferentes combinaciones de dependencia. En un caso, el problema desapareció cuando incluí la cryptography en mis requirements.txt . Pero como Jean Silva había mencionado en este hilo, es posible que las dependencias puedan estar en conflicto. Así que quizás quieras jugar con diferentes combinaciones hasta que algo funcione.

Posible solución 2

Si usa Flask, intente tener el paquete / módulo werkzeug.security para hacer hash / verificar hashes en lugar de usar el paquete bcrypt directamente. En el siguiente ejemplo en mi models.py , comentar esas líneas y agregar otras nuevas solucionó el problema por mí.

 # from index import db, bcrypt from index import db from werkzeug.security import generate_password_hash, check_password_hash class User(db.Model): id = db.Column(db.Integer(), primary_key=True) email = db.Column(db.String(255), unique=True) password = db.Column(db.String(255)) def __init__(self, email, password): self.email = email self.active = True self.password = User.hashed_password(password) @staticmethod def hashed_password(password): # return bcrypt.generate_password_hash(password) return generate_password_hash(password) @staticmethod def get_user_with_email_and_password(email, password): user = User.query.filter_by(email=email).first() # if user and bcrypt.check_password_hash(user.password, password): if user and check_password_hash(user.password, password): return user else: return None 

Al instalar bcrypt == 3.1.2 es un trabajo para mí

 pip install bcrypt==3.1.2 

He encontrado la solución, estaba usando los siguientes paquetes: bcrypt , flask_bcrypt y py-crypt . Así que desinstalo py-bcrypt , probablemente este paquete estaba en conflicto con el paquete bcrypt .

 pip uninstall py-bcrypt 

desinstalar tanto py-bcrypt y bcrypt es que lo instaló anteriormente. A continuación, instale py-bcrypt de nuevo.

pip install py-bcrypt