web-dev-qa-db-ja.com

Gunicornで実行中のFlaskアプリのデバッグ

私はnginx/gunicornとFlask=私のアプリケーションのために使用して新しい開発プラットフォームに取り組んできました。

残念ながら、すべてが正常に動作します-私が抱えている問題は、Flaskレイヤーをデバッグすることです。コードにエラーがある場合、ブラウザに500エラーが返されます。コンソールにもログにも何も表示されません。

私は多くの異なる設定/オプションを試しました。私はmust明らかな何かを見逃していると思います。

私のgunicorn.conf:

import os

bind = '127.0.0.1:8002'
workers = 3
backlog = 2048
worker_class = "sync"
debug = True
proc_name = 'gunicorn.proc'
pidfile = '/tmp/gunicorn.pid'
logfile = '/var/log/gunicorn/debug.log'
loglevel = 'debug'

いくつかの例Flask borks- testserver.pyのコード:

from flask import Flask
from flask import render_template_string
from werkzeug.contrib.fixers import ProxyFix

app = Flask(__name__)

@app.route('/')
def index():
    n = 1/0
    return "DIV/0 worked!"

最後に、gunicornでflaskアプリを実行するコマンド:

gunicorn -c gunicorn.conf.py testserver:app

ありがとう

61
mafrosis

Flask構成は、gunicornの構成とは完全に分離されています。設定ファイルに関するFlaskドキュメント に続いて 、良い解決策はソースをこれに変更することです:

app = Flask(__name__)
app.config.from_pyfile('config.py')

そしてconfig.pyで:

DEBUG = True
45
mafrosis

受け入れソリューションは私には機能しません。

Gunicornは分岐前の環境であり、明らかに Flaskデバッガは分岐環境では機能しません

注意

対話型デバッガーはフォーク環境では機能しませんが(実稼働サーバーでの使用はほぼ不可能です)[...]

app.debug = Trueを設定した場合でも、gunicorn testserver:appで実行すると、メッセージInternal Server Errorを含む空のページのみが表示されます。 gunicornでできることは、gunicorn --debug testserver:appで実行することです。これにより、Internal Server Errorメッセージに加えてトレースが提供されます。ただし、これは端末に表示されるテキストトレースと同じであり、Flaskデバッガーではありません。

if __...セクションをtestserver.pyに追加し、python testserver.pyを実行して開発中のサーバーを起動すると、Flaskデバッガー。言い換えれば、Flask=デバッガーが必要な場合、gunicornを開発に使用しないでください。

app = Flask(__name__)
app.config['DEBUG'] = True

if __== '__main__':
    app.run()


Herokuユーザー向けのヒント:

個人的には、 これはすべてのenv変数を設定します なので、foreman startの代わりにpython testserver.pyを使用したいです。これを機能させるには:

Procfileの内容

web: bin/web

bin/webの内容、ファイルはプロジェクトルートに関連しています

#!/bin/sh

if [ "$FLASK_ENV" == "development" ]; then
        python app.py
else
        gunicorn app:app -w 3
fi

開発では、プロジェクトルートに関連する.envファイルを次の内容で作成します(docs here

FLASK_ENV=development
DEBUG=True

また、app.config['DEBUG']...testserver.py行を、実稼働環境のデバッグモードでFlask=)を実行しないものに変更することを忘れないでください。

app.config['DEBUG'] = os.environ.get('DEBUG', False)
73
Nick Zalutskiy

Herokuユーザーの場合、Nickが提案するようなbin/webスクリプトを作成するよりも簡単なソリューションがあります。

の代わりに foreman start、使用するのはforeman run python app.py開発中のアプリケーションをデバッグする場合。

23
aristidesfl

実行コマンドでデバッグフラグを次のように設定してみてください

gunicorn -c gunicorn.conf.py --debug testserver:app

DEBUG = True in Flask application。デバッグオプションが設定ファイルから適用されていないのには理由があるに違いありませんが、今のところは上記の注意事項で解決できます。

0
Fuchida

flaskをgunicornで実行すると、ブラウザでスタックトレースが表示されませんでした(毎回ログを表示する必要がありました)。最後にこれをやった:

app = Flask(__name__)
app.config.from_object(settings_map[environment])
if environment == 'development':
    from werkzeug.debug import DebuggedApplication
    app_runtime = DebuggedApplication(app, evalex=False)
else:
    app_runtime = app

対話型デバッグはフォーク(gunicorn)では機能しないため、evalexは無効になっています。

0
jazgot