【问题标题】:Flask and Gunicorn on Heroku import errorHeroku 导入错误的 Flask 和 Gunicorn
【发布时间】:2013-04-25 04:29:58
【问题描述】:

我有一个使用 MongoEngine 的小型 Flask 应用程序。

我的项目结构:

/myproject
  -application.py
  -config.py
  /my_app
    -models.py
    -views.py

我的应用程序.py:

#!/usr/bin/env python
from flask.ext.mongoengine import MongoEngine
from config import app
import os
app.debug = True

# get config settings
if __name__ == '__main__':
    app.config.from_object('config')
else:
    app.config.from_object('heroku_config')

# wrap app in mongengine
db = MongoEngine(app)

if __name__ == '__main__':
    # Bind to PORT if defined, otherwise default to 5000.
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

我的模型.py:

from application import db
from flask import url_for

# declare model classes
...

我正在 Heroku 上进行部署。如果我的 Procfile 读取:

 web: python application.py

它工作正常。当我尝试切换到 Gunicorn 时:

 web: gunicorn application:app  

当我启动 gunicorn 时,它会通过导入错误来抱怨:

ImportError: cannot import name db

为什么现在这是一个问题?我猜这是路径问题,但我不明白为什么会这样。

【问题讨论】:

    标签: python heroku flask mongoengine


    【解决方案1】:

    我假设您在 application.py 中注册蓝图或类似的东西,这反过来又会导入模型,对吧?
    您没有提供视图文件或您如何使用视图文件,如果我的猜测不正确,我下面的答案也不会是。

    如果我的猜测是正确的,那可能是因为循环导入。 您可以创建一个包含这些行的 db.py 文件(从 application.py 移动):

    from flask.ext.mongoengine import MongoEngine
    db = MongoEngine(app)
    

    然后将该文件导入您的模型 (from db import db)。
    这意味着流程看起来像这样:db -> model -> view -> app 而不是 app (db) -> model -> view -> app

    循环导入会产生各种烦人的问题,尽可能避免它们。

    【讨论】:

      【解决方案2】:

      如果您使用的是 init 样式的烧瓶模块,则以下工作(源自托盘烧瓶教程 v Flask 2.0.1)。 https://www.palletsprojects.com/p/flask/

      web: env FLASK_APP=flaskr gunicorn -b '0.0.0.0':${PORT} 'flaskr:create_app()'
      

      create_app 是从中调用的“应用程序” flaskr/init.py

      【讨论】:

        猜你喜欢
        • 2021-06-24
        • 2013-10-21
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 2021-01-20
        • 2020-05-12
        相关资源
        最近更新 更多