Пакет Python bcrypt на Heroku выдает ошибку атрибута: объект ‘module’ не имеет атрибута ‘ffi’

#python #heroku #flask #bcrypt

#python #heroku #колба #bcrypt

Вопрос:

У меня возникла проблема с использованием bcrypt в моем приложении Flask на Heroku. Когда я развертываюсь в Heroku и перехожу к маршруту входа, я получаю 500 внутренних ошибок сервера. Он работает корректно локально. Как мне заставить пакет bcrypt работать на 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'
  

Ответ №1:

Я столкнулся с аналогичной проблемой. Вот копия последней части моей трассировки стека:

   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' 
  

Мне интересно, является ли эта проблема специфичной для Heroku. Я использовал какой-то существующий шаблон Flask. Но эта проблема с Bcrypt также случалась со мной в предыдущих проектах при использовании (другого) шаблонного проекта Flask на Heroku.

Возможное решение 1

Поиграйте с различными комбинациями зависимостей. В одном случае проблема исчезла, когда я включил cryptography в свой requirements.txt . Но, как упоминал Жан Сильва в этой теме, возможно, что зависимости могут конфликтовать. Поэтому вы можете поиграть с разными комбинациями, пока что-то не сработает.

Возможное решение 2

При использовании Flask попробуйте werkzeug.security использовать пакет / модуль для хэширования / проверки хэшей, а не использовать bcrypt пакет напрямую. В примере ниже в моем models.py , закомментирование таких строк и добавление новых решили проблему для меня.

 # 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
  

Ответ №2:

Установив bcrypt == 3.1.2, это работает для меня

 pip install bcrypt==3.1.2
  

Ответ №3:

Я нашел решение, я использовал следующие пакеты: bcrypt , flask_bcrypt и py-crypt . Поэтому я удаляю py-bcrypt , вероятно, этот пакет конфликтовал с bcrypt пакетом.

 pip uninstall py-bcrypt
  

Комментарии:

1. знаете ли вы о каких-либо других пакетах, которые могут вызывать эту проблему? Я не py-bcrypt установлен, но также сталкиваюсь с тем же сообщением об ошибке. Спасибо

Ответ №4:

удалите оба py-bcrypt и bcrypt, если вы установили их ранее. Затем установите py-bcrypt заново.

pip install py-bcrypt

Комментарии:

1. Да, это сработало для меня. bcrypt Сначала я установил, не работал так, как хотел, затем добавил py-bcrypt и удалил bcrypt . Думаю, это ему не понравилось, но как только я удалил и переустановил py-bcrypt , все заработало.

Ответ №5:

В Python 3.7 ниже приведена последовательность команд, которые устранили ошибку в моем случае:

 pip uninstall py-bcrypt amp;amp; pip uninstall flask-bcrypt amp;amp; pip uninstall bcrypt amp;amp; pip install flask-bcrypt