Heroku上的Flask和Gunicorn导入错误

时间:2013-04-25 04:29:59

标签: python heroku flask mongoengine

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

我的项目结构:

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

我的application.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)

my models.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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我假设您在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

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

答案 1 :(得分:0)

如果您使用的是 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