3

セット付きのdjangoアプリケーションがありhandler500ます。カスタム例外ハンドラーを追加したいと思います。プロセス例外を処理するミドルウェアを作成します。

ビューで例外が発生すると、Django は process_exception() を呼び出します。process_exception() は None または HttpResponse オブジェクトを返す必要があります。HttpResponse オブジェクトを返す場合、応答はブラウザに返されます。それ以外の場合は、デフォルトの例外処理が開始されます。

https://docs.djangoproject.com/en/dev/topics/http/middleware/?from=olddocs#process-exception

ErrorMiddlewareのように見えます:

class ErrorMiddleware(object):
    def process_exception(self, request, exception):
        try:
            #logic goes here
        except Exception:
            pass
        return None

settingsのように見えます:

MIDDLEWARE_CLASSES = (
    'my.error.ErrorMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
DEBUG = False

この場合、私のブラウザはページから例外で応答を受け取りません。リストにミドルウェアがなくても、handler500正しく動作します。

handler500ミドルウェアでビューを明示的に呼び出さずに、デフォルトの例外処理メカニズムを実行したい。

更新日:

handler500 モジュールは次のようになります。

#imports ....

def custom_500(request):
    """ Return an error ID (hash) that can be provided to support """
    return render(request, '500.html', {
        'timestamp': datetime.datetime.now().isoformat(),
        'diagcode': "hello",
        }
    )
4

1 に答える 1

5

ミドルウェアをスタックの一番下に移動してみてください。MIDDLEWARE_CLASSESこれにより、クライアントに送信される途中でリクエストを処理する最初のミドルウェアになります。Djangoはすでにあなたの例外をキャッチしていて、最後に置くと独自のエラー500ページをレンダリングしたと思います。

于 2012-10-07T13:33:17.247 に答える