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