Python Bcrypt Package On Heroku Gives AttributeError: 'module' Object Has No Attribute 'ffi'
Solution 1:
I encountered a similar issue. Here is a copy of the last part of my stack trace:
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'
I'm wondering if this issue is particular to Heroku. I was using some existing Flask boilerplate. But this issue with Bcrypt has also happened to me in previous projects when using a (different) boilerplate Flask project on Heroku.
Possible Solution 1
Play around with different dependency combinations. In one case, the issue went away when I included cryptography
in my requirements.txt
. But as Jean Silva had mentioned in this thread, it is possible that dependencies could be in conflict. So you might want to play with different combinations until something works.
Possible Solution 2
If using Flask, try having the werkzeug.security
package/module to hash / check hashes as opposed to using the bcrypt
package directly. In example below in my models.py
, commenting out such lines and adding new ones solved the issue for me.
# 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
Solution 2:
By installing bcrypt==3.1.2 it's work for me
pip install bcrypt==3.1.2
Solution 3:
I've found the solution, I was using the following packages: bcrypt
, flask_bcrypt
and py-crypt
. So I uninstall the py-bcrypt
, probably this package was in conflict with bcrypt
package.
pip uninstall py-bcrypt
Solution 4:
uninstall both py-bcrypt and bcrypt is you installed it previously. Then install py-bcrypt afresh.
pip install py-bcrypt
Solution 5:
With Python 3.7, below is the sequence of commands that resolved the error in my case:
pip uninstall py-bcrypt && pip uninstall flask-bcrypt && pip uninstall bcrypt && pip install flask-bcrypt
Post a Comment for "Python Bcrypt Package On Heroku Gives AttributeError: 'module' Object Has No Attribute 'ffi'"