2011-06-24 1 views
4

私は自分のミドルウェアクラスをDjangoで作成しました。これは最近までうまく動作していました。奇妙なことに、process_requestはまだうまく呼び出されていますが、応答が500であっても(内部のサーバーエラー)、process_exceptionはまったく呼び出されません。どうして?Djangoミドルウェアクラスの場合、process_requestはどのようにうまくいくのですか?process_exceptionは呼び出しではありません。

設定ファイル内にインストールされているミドルウェアのリストの最初または最後の項目としてミドルウェアクラスを宣言するかどうかは違いありません。

おかげで、 デイブ

+0

process_exception自体で例外が発生する可能性がありますか? – Boldewyn

+1

'process_exception'メソッドの先頭に' import pdb; pdb.set_trace() 'を置き、runserverを起動して500エラーを発生させます。 runserverがpdbセッションに入ると、あなたのメソッドは確実に呼び出されます。次に、何が起こるか見るためにステップスルーします。 –

+0

私は同じ問題を抱えています。私は例外の電子メールに詳細を追加したい。私はhttp://stackoverflow.com/questions/6678895/django-error-reporting-how-to-know-which-user-triggered-the-errorから解決策を見つけました。私は実装してprocess_exception()が実行されていないようです。 process_request()メソッドを追加し、request.META ['MYVAR'] = "funky"を追加しました。これは電子メールに含まれていますが、process_exception()を呼び出せないようです。また、MIDDLEWARE_CLASSES設定で異なる場所(最初と最後)を試しました。 – Furbeenator

答えて

7

process_exceptiononly gets invoked when the view raises an Exception。コメントに

ビューが例外を上げた場合

、例外ミドルウェアを通してそれを実行し、
、例外ミドルウェアは、応答を返した場合、それを使用し言うように。
それ以外の場合は、例外を再発行してください。

設定ミスによって発生した例外、エラーをインポートし、process_requestprocess_viewがキャッチされ、process_exceptionハンドラに送り込むことができません。

process_exceptionが機能するかどうかをテストするには、正常に動作していることを確認してから、ビューで例外を発生させます。

process_requestprocess_exceptionの間には直接の関係はありませんが、それらはさまざまな目的のためのハンドラであり、さまざまな段階で呼び出されます。 process_requestが正常に実行され、ビューの前に発生した例外は、process_exceptionによって捕捉され処理されません。

2

にprocess_exceptionは、

process_exception(self, request, exception) 

引数としてのHttpRequestオブジェクト、ビュー関数によって発生例外オブジェクトを受け取り、response.SoとしてHttpResponseobjectを返すドキュメントごとのように、それはコードと呼ばれることはありません500エラー(HttpResponseオブジェクト)を発生させます。process_exceptionは、ビュー内のキャッチされていない例外に対してのみ呼び出されます。

関連する問題