#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