5

同様の質問が寄せられていますが、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

私のプロフィールは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 の方がいいです。私のメインアプリがルートディレクトリにないという事実に問題があるようですか?

前もって感謝します。

4

1 に答える 1

14

問題は、run.py無防備に呼び出すことですapp.run-これは実際にはwerkzeug.serving.run_simple、着信リクエストを処理するサブプロセスを開始する呼び出しです... gunicorn で実行している場合は実行したくない (gunicorn がプロセス管理を処理するため)。

if __name__ == "__main__"呼び出しの前にガードを追加するだけapp.runで、すべてが機能するはずです。

# run.py
if __name__ == "__main__":
    app.run()
于 2013-04-15T22:43:47.027 に答える