【问题标题】:Python bcrypt package on Heroku gives AttributeError: 'module' object has no attribute 'ffi'Heroku 上的 Python bcrypt 包给出 AttributeError: 'module' object has no attribute 'ffi'
【发布时间】:2017-02-20 05:09:45
【问题描述】:

我在 Heroku 上的 Flask 应用程序中使用 bcrypt 时遇到问题。当我部署到 Heroku 并转到登录路径时,我收到 500 Internal server error。它在本地正常工作。如何让 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'

【问题讨论】:

    标签: python heroku flask bcrypt


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      卸载 py-bcrypt 和 bcrypt 是你之前安装的。 然后重新安装 py-bcrypt。

      pip install py-bcrypt

      【讨论】:

      • 是的,这对我有用。我首先安装了bcrypt,但没有按我的意愿工作,然后添加py-bcrypt 并删除了bcrypt。我猜它不喜欢那样,但是一旦我卸载并重新安装了py-bcrypt,一切都奏效了。
      【解决方案3】:

      我找到了解决方案,我使用了以下软件包:bcryptflask_bcryptpy-crypt。所以我卸载了py-bcrypt,可能这个包和bcrypt包冲突了。

      pip uninstall py-bcrypt
      

      【讨论】:

      • 您是否知道任何其他可能导致此问题的软件包?我没有安装py-bcrypt,但也面临同样的错误消息。谢谢
      【解决方案4】:

      通过安装 bcrypt==3.1.2 它对我有用

      pip install bcrypt==3.1.2
      

      【讨论】:

        【解决方案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 中时,问题就消失了。但是正如 Jean Silva 在这个线程中提到的那样,依赖关系可能会发生冲突。因此,您可能想尝试不同的组合,直到有效果为止。

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

        【讨论】:

          猜你喜欢
          • 2015-09-26
          • 1970-01-01
          • 1970-01-01
          • 2013-07-26
          • 2021-07-25
          • 2014-12-20
          • 2022-12-01
          • 2012-02-29
          • 2022-12-01
          相关资源
          最近更新 更多