【问题标题】:Heroku app runs locally but gets H12 timeout error (uses a package)Heroku 应用程序在本地运行但出现 H12 超时错误(使用包)
【发布时间】:2013-04-07 21:30:28
【问题描述】:

已经提出了类似的问题,但 H12 似乎是由许多原因引起的,并且没有一个答案适用于此。我以前用 heroku 构建了 python 应用程序,但现在我使用的是 Miguel Grinberg 的 Flask Mega-Tutorial 的包结构,我不知道出了什么问题。

我的应用程序是带有 Heroku postgres 数据库的 python / Flask / SQLAlchemy。该应用程序完全可以在本地运行。当我推送到 Heroku 时,我得到一个 H12。

这是我的应用结构:

  rootappdirectory\
      app\
        static\
        templates\
        __init__.py
        views.py
        models.py
      run.py
      [plus flask / venv files]

run.py 看起来像这样:

import os
from flask import Flask

from app import app
app.run()

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

我的 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

我玩过不同的选项 - 起初我遇到了一个“正在使用的连接”错误,我通过进入 debug=False 来修复它,但坦率地说,我宁愿处于 debug=True!我的主应用不在根目录下似乎有问题?

提前致谢。

【问题讨论】:

    标签: python heroku flask gunicorn


    【解决方案1】:

    问题是run.py 毫无防备地调用app.run - 这实际上调用了werkzeug.serving.run_simple,它启动了一个子进程来处理传入的请求......在 gunicorn 下运行时你不想这样做(因为 gunicorn将为您处理流程管理)。

    只需在您的 app.run 调用之前添加一个 if __name__ == "__main__" 保护,一切都会正常工作:

    # run.py
    if __name__ == "__main__":
        app.run()
    

    【讨论】:

    • 谢谢!无法通过单行解决方案获得简洁的答案。非常感谢。
    • @TheOnlyAnil - 我会用您的问题的最小可重现示例问另一个问题。考虑到上面的问题,这应该可行(这意味着您的代码可能不匹配,问题出在其他地方)。
    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 2019-12-15
    • 2020-01-26
    • 2019-09-07
    • 2021-05-10
    • 2020-06-25
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多