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