python heroku flask bcrypt

El paquete Python bcrypt en Heroku da AttributeError: el objeto ''module'' no tiene el atributo ''ffi''



flask (3)

Tengo un problema al usar bcrypt con mi aplicación Flask en Heroku. Cuando despliego a Heroku y voy a la ruta de inicio de sesión obtengo un error de 500 Internal Server. Funciona correctamente a nivel local. ¿Cómo hago para 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''


Encontré un problema similar. Aquí hay una copia de la última parte de mi rastro de pila:

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 para Heroku. Estaba usando una plantilla estándar de Flask. Pero este problema con Bcrypt también me ha sucedido en proyectos anteriores al usar un proyecto Flask (diferente) 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 es posible que desee jugar con diferentes combinaciones hasta que algo funcione.

Posible solución 2

Si usa Flask, trate de tener el paquete / módulo werkzeug.security para hash / check hashes en lugar de usar el paquete bcrypt directamente. En el siguiente ejemplo de mi models.py , comentar estas líneas y agregar nuevas resolvió el problema para 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 me funciona

pip install bcrypt==3.1.2


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

pip uninstall py-bcrypt