0

の正しく実行可能な実装に頭を悩ませようとしています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
4

0 に答える 0