我正试图围绕process_view
的正确,可行的实现。我们的想法是在process_view
中调用视图函数。我的问题主要是如何处理视图函数中的异常。
我的理解是,中间件函数可能永远不会引发异常,因此必须捕获视图函数可能抛出的所有异常。这种理解在实践中确实得到了证实:如果我没有捕获异常,Django的基本处理程序将跳过任何process_exception调用。但是,如果我确实捕获了异常,则视图函数将被调用两次(一次由我的中间件调用,并且再一次由基本处理程序调用以尝试运行异常,因此它可以由各种中间件{{1}处理})。在下面的snipplet中,第一个电话在process_exception
,第二个电话在response = middleware_method(...
。
Django 1.4的django / core / handlers / base.py:
response = callback(...
为了更加清晰,这是我的中间件:
# 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