Skip to content Skip to sidebar Skip to footer

Python Bcrypt Package On Heroku Gives Attributeerror: 'module' Object Has No Attribute 'ffi'

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 locall

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, bcryptfrom index import db
from werkzeug.security import generate_password_hash, check_password_hash


classUser(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)

    @staticmethoddefhashed_password(password):
        # return bcrypt.generate_password_hash(password)return generate_password_hash(password)

    @staticmethoddefget_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:
            returnNone

Solution 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'"