I'm having a problem using bcrypt with my Flask application on Heroku. When I deploy to Heroku and go to the login route I get 500 Internal server error. It works correctly locally. How do I get the bcrypt package working on 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'
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
By installing bcrypt==3.1.2 it's work for me
pip install bcrypt==3.1.2
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
uninstall both py-bcrypt and bcrypt is you installed it previously. Then install py-bcrypt afresh.
pip install py-bcrypt
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With