Heroku应用程序在本地运行,但得到H12超时错误(使用包)

Mic*_*son 3 python heroku flask gunicorn

类似的问题已被提出,但H12似乎是由许多事情引起的,这里没有一个答案适用.我之前用heroku构建了python应用程序,但现在我正在使用Miguel Grinberg的Flask Mega-Tutorial的包结构,我无法弄清楚出了什么问题.

我的应用程序是python/Flask/SQLAlchemy,带有Heroku postgres数据库.该应用程序完全在本地工作 当我推到Heroku时,我得到了H12.

这是我的app结构:

  rootappdirectory\
      app\
        static\
        templates\
        __init__.py
        views.py
        models.py
      run.py
      [plus flask / venv files]
Run Code Online (Sandbox Code Playgroud)

run.py看起来像这样:

import os
from flask import Flask

from app import app
app.run()
Run Code Online (Sandbox Code Playgroud)

而app/__ init__.py看起来像这样:

(a bunch of imports)

app = Flask(__name__)
db = SQLAlchemy(app)

login_manager = LoginManager()
(a bunch of login_manager stuff)

from app import views, models
Run Code Online (Sandbox Code Playgroud)

我的Procfile是 web: gunicorn run:app

我在本地和远程使用heroku数据库.该应用程序在我的本地计算机上完美运行(0.0.0.0:5000).但是,当我推送到heroku并运行应用程序时,这是日志:

2013-04-15T06:50:27.165532+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path=/favicon.ico host=floating-driftwood-6203.herokuapp.com fwd="24.6.48.240" dyno=web.1 connect=1ms service=30007ms status=503 bytes=0
2013-04-15T06:50:34.908756+00:00 app[web.1]: 2013-04-15 06:50:34 [2] [CRITICAL] WORKER TIMEOUT (pid:65)
2013-04-15T06:50:34.914436+00:00 app[web.1]: 2013-04-15 06:50:34 [2] [CRITICAL] WORKER TIMEOUT (pid:65)
2013-04-15T06:50:34.918114+00:00 app[web.1]: 2013-04-15 06:50:34 [66] [INFO] Booting worker with pid: 66
2013-04-15T06:50:35.083182+00:00 app[web.1]:  * Running on http://127.0.0.1:5000/
2013-04-15T06:51:04.216671+00:00 app[web.1]: 2013-04-15 06:51:04 [2] [CRITICAL] WORKER TIMEOUT (pid:66)
2013-04-15T06:51:04.223440+00:00 app[web.1]: 2013-04-15 06:51:04 [2] [CRITICAL] WORKER TIMEOUT (pid:66)
2013-04-15T06:51:04.229350+00:00 app[web.1]: 2013-04-15 06:51:04 [67] [INFO] Booting worker with pid: 67
Run Code Online (Sandbox Code Playgroud)

我玩了不同的选项 - 起初我得到了一个"使用中的连接"错误,我通过调试= False来修复,但坦率地说我宁愿在debug = True!我的主应用程序不在根目录中的事实似乎有问题吗?

提前致谢.

Sea*_*ira 11

问题是run.py无人值守的调用app.run- 这实际上是调用werkzeug.serving.run_simple启动子进程来处理传入的请求...当你在gunicorn下运行时你不想做什么(因为gunicorn会为你处理进程管理).

只需if __name__ == "__main__"app.run通话前添加一名警卫,一切都应该有效:

# run.py
if __name__ == "__main__":
    app.run()
Run Code Online (Sandbox Code Playgroud)