の正しく実行可能な実装に頭を悩ませようとしていますprocess_view
。アイデアは、でビュー関数を呼び出すことprocess_view
です。私の問題は、主にビュー関数で例外を処理する方法です。
ミドルウェア関数が例外を発生させない可能性があることを理解しているため、ビュー関数によってスローされる可能性のあるすべての例外をキャッチする必要があります。この理解は実際に確認されています。例外をキャッチしない場合、Django のベース ハンドラーはすべての process_exception 呼び出しをスキップします。ただし、例外をキャッチすると、ビュー関数が 2 回呼び出されます (1 回はミドルウェアによって、もう 1 回はベース ハンドラーによって例外に遭遇しようとするため、さまざまなミドルウェアによって処理されますprocess_exception
)。以下のスニペットでは、最初の呼び出しが inresponse = middleware_method(...
で、2 番目の呼び出しが inresponse = callback(...
です。
Django 1.4 の django/core/handlers/base.py からの抜粋:
# Apply view middleware
for middleware_method in self._view_middleware:
response = middleware_method(request, callback, callback_args, callback_kwargs)
if response:
break
if response is None:
try:
response = callback(request, *callback_args, **callback_kwargs)
except Exception, e:
# If the view raised an exception, run it through exception
# middleware, and if the exception middleware returns a
# response, use that. Otherwise, reraise the exception.
for middleware_method in self._exception_middleware:
response = middleware_method(request, e)
if response:
break
if response is None:
raise
さらに明確にするために、これは私のミドルウェアです。
class MyMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
# ... do stuff
try:
response = view_func(request, *view_args, **view_kwargs)
except:
return None
# or, alternatively (but this has its own set of problems)
response = view_func(request, *view_args, **view_kwargs)
# do more stuff