10

nginxのカスタムエラーページを無効にして、フレームワークの例外ページを表示することはできますか?

私のwerkzeugデバッガツールがhtmlでレンダリングされているのを実際に見ることができません...

アップデート

OK、動作するように非常に単純なフラスコアプリケーションを作成する必要があります。ビットを投稿します。

/home/my_user/.virtualenvs/nginx-test/etc/nginx.conf

worker_processes 1;
events { worker_connections 1024; }
http {
        server {
                listen 5000;
                server_name localhost;
                access_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/access.log;
                error_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/error.log;

                location / {
                        include uwsgi_params;
                        uwsgi_pass unix:/tmp/uwsgi.sock;
                }
        }
}

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    raise Exception()

if __name__ == '__main__':
    app.run('0.0.0.0', debug=True)

PYTHONPATH環境変数:

$ echo $PYTHONPATH
/home/my_user/dev/

uwsgiの実行方法:

$ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app

nginxの実行方法:

$ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/

ルートページにアクセスした場合:

サーバーエラー

次のようにnginxを手動で実行した場合:

python /home/my_user/dev/nginx_test/___init___.py

代わりに、私が見たいものを見ていきます。

ここに画像の説明を入力してください

もちろん、例外を発生させなくても機能することを確認しましたが、たとえばindex()関数で「HelloWorld」を返しました。

これは、.NETのカスタムエラーページと呼ばれます。これを無効にして、内部サーバーエラーではなく、デバッガーによって生成されたhtmlをブラウザーに直接渡せるようにします。

更新2

ここで、フラスコアプリを変更してデバッグモードを有効にすると、次のようになります。

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask

app = Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/')
def index():
    raise Exception()

if __name__ == '__main__':
    app.run('0.0.0.0', debug=True)

次に、502エラーが発生します。

しかし、私が例外を発生させる代わりに:

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask

app = Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/')
def index():
    return 'Hello World'

if __name__ == '__main__':
    app.run('0.0.0.0', debug=True)

ページ( http:// localhost:5000 )にアクセスすると、ブラウザに「HelloWorld」が表示されます。

4

3 に答える 3

8

この「内部サーバーエラー」ページはnginxからではなく、Flaskからのものです。これは、デバッグモードがオフの場合に行われます。

uwsgiは、スクリプトとしてではなく、モジュールとしてコードをインポートしています。__name__ == '__main__'Falseであり、ifステートメントは実行されません。次の場合以外でデバッグモードを設定してみてください。

app = Flask(__name__)
app.debug = True

ただし、ユーザーはサーバーに任意のコードを実行させることができるため、パブリックインターネット上のサーバーでデバッグモードを終了しないことを強くお勧めします。これは重大なセキュリティ問題です。

于 2012-07-27T18:59:23.153 に答える
1

サイモン・サピンは本当にあなたに正しい答えを与えました. Flask でデバッグを有効にする必要があります。明示的に設定しない限り、Nginx はカスタム エラー ページを返しません。

次のコードを使用すると、Nginx 経由でプロキシされたフラスコからのデバッグ メッセージが表示されます。

from flask import Flask

app = Flask(__name__)
app.debug = True

@app.route('/')
def index():
    raise Exception()

更新 2 によると、502 (不正なゲートウェイ) が表示されます。これは、Flask がまったく応答を返さないか、Nginx が理解できない応答を返しているためです。502 は Nginx の問題ではありません。これは、Nginx が話そうとしているもの (この場合はフラスコ アプリ) がまったく正しく機能していないことを意味します。

ただし、多くの点で、これを行うべきではありません。デバッグ モードは、ローカルの開発マシンでフラスコを実行している場合にのみ有効にする必要があります。if __name__ == "__main__":とにかく、これがラインの全体的なポイントです。

于 2012-09-19T10:00:31.300 に答える
1

Flask#errorhandler独自のエラー ハンドラをフラスコに登録するために使用します。たとえば、404 を置き換えるには、次のようにします。

app = Flask()

@app.errorhandler(404)
def handel_404(error):
    return render_template('404.html')
于 2012-06-21T20:30:35.633 に答える