14

我无法使用简单的烧瓶应用程序在 heroku 上运行 gunicorn。
该应用程序非常简单。这是 app.py:

app = Flask(__name__)

@app.route("/")
def say_hello(url):
    return "Hello"


if __name__ == "__main__":
    port = int(os.environ.get('PORT', 8888))
    app.run(host='0.0.0.0',port=port)

该应用程序通过 heroku 上的烧瓶测试服务器运行良好,但是当我切换到使用 gunicorn 时,它会崩溃:

ImportError: No module named app.wsgiapp

我的要求.txt:

Flask==0.8
gevent==0.13.7
gunicorn==0.13.2

我尝试了从 0.13.7 到 0.14.6 的不同版本的 gunicorn,但没有成功。

档案:

web: gunicorn app:app -w 4 -b 0.0.0.0:$PORT

运行此命令:

heroku logs

给出了这个:

←[33m2012-08-09T21:08:02+00:00 app[web.1]:←[0m ImportError: No module named app.
wsgiapp ←[33m2012-08-09T21:08:02+00:00 app[web.1]:←[0m     entry = __import__(self.modul
e_name, globals(),globals(), ['__name__'])

请问有什么帮助吗?

4

4 回答 4

11

就我而言,我gunicorn.py在顶级文件夹中有一个文件时遇到了这个错误。这与 Heroku 上已安装的 gunicorn 库发生冲突。

所以我导致问题的运行命令是:

gunicorn -c gunicorn.py myapp:main

引发以下错误:

Traceback (most recent call last):
  File "/app/.heroku/python/bin/gunicorn", line 9, in <module>
    load_entry_point('gunicorn==18.0', 'console_scripts', 'gunicorn')()
  File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
    return ep.load()
  File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named app.wsgiapp

而在mv gunicorn.py gunicorn_config.py它工作正常之后:

gunicorn -c gunicorn_config.py myapp:main
于 2015-01-14T11:04:58.430 回答
4

我在将 Ubuntu 升级到 14.04 LTS 时遇到了这个问题。

由于某种原因,gunicorn未能选择正确的 python 路径来解析 wsgi 模块。

我现在解决了这个问题,方法是gunicorn通过--pythonpath参数显式声明 python 路径(在此处记录)。

例如:

gunicorn --pythonpath /path/to/containing/directory "app.wsgi_app:wsgi_app"
于 2015-04-11T23:17:54.210 回答
3

我终于想通了这一点。

这基本上只是一个PATH问题。如果根据您的设置以错误的顺序导入某些模块(如ossys ),您将导致 Gunicorn 在app.wsgiapp模块的错误包中查找。(不要与 Flask 中的app.wsgi_app函数混淆)

正确的导入顺序将根据您的设置而有所不同,但基于我能够工作的经验法则是确保您的sys模块在您的os模块之前导入。

除此之外,假设其余配置是正常的(如上所述),您应该没有任何问题。

注意:这只是 Gunicorn 在 Heroku 上的问题。这与他们的 PYTHONPATH 和模块搜索路径的设置方式有关。我不知道为什么,但这只是生产环境所必需的,无论模块导入顺序如何,本地设置都可以正常工作。

于 2012-12-16T21:01:57.083 回答
1

我的猜测是 python 路径中还有另一个“应用程序”模块(gunicorn 和烧瓶都有一个名为 app 的模块)。将其重命名为 app.py 以外的任何其他名称,它应该可以工作。

于 2012-08-17T21:01:37.627 回答