Heroku上的Python bcrypt包给出了AttributeError:'module'对象没有属性'ffi'

时间:2016-10-11 15:27:29

标签: python heroku flask bcrypt

我在Heroku上使用带有Flask应用程序的bcrypt时出现问题。当我部署到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'

5 个答案:

答案 0 :(得分:5)

我遇到了类似的问题。这是我的堆栈跟踪的最后一部分的副本:

  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样板。但是,在Heroku上使用(不同的)样板Flask项目时,Bcrypt的这个问题也发生在我以前的项目中。

可能的解决方案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

答案 1 :(得分:1)

我找到了解决方案,我使用的是以下软件包:<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" DefaultLoadingPanelID="RadAjaxLoadingPanel1"> <AjaxSettings> <telerik:AjaxSetting AjaxControlID="RadGrid1"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="RadGrid1" UpdatePanelCssClass="" /> </UpdatedControls> </telerik:AjaxSetting> </AjaxSettings> </telerik:RadAjaxManager> <div style="padding-left: 20px;"> <telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource" OnColumnCreated="RadGrid1_ColumnCreated" AllowSorting="True" AllowPaging="True" CellSpacing="-1" GridLines="Both" Skin="Black"> </telerik:RadGrid> </div> bcryptflask_bcrypt。所以我卸载了py-crypt,可能这个包与py-bcrypt包有冲突。

bcrypt

答案 2 :(得分:1)

通过安装bcrypt == 3.1.2,它为我工作

pip install bcrypt==3.1.2

答案 3 :(得分:0)

卸载py-bcrypt和bcrypt你以前安装过吗? 然后重新安装py-bcrypt。

pip install py-bcrypt

答案 4 :(得分:0)

对于Python 3.7,以下是针对我的情况解决错误的命令序列:

pip uninstall py-bcrypt && pip uninstall flask-bcrypt && pip uninstall bcrypt && pip install flask-bcrypt