我有这个middelware,它可以捕获500/400异常并处理它们。但它永远不会被称为。我把它放在MIDDLEWARE_CLASSES
的开头和结尾,但是当引发异常时它仍然没有运行:
垂直/ middleware.py:
class HandleExceptionsMiddleware(object):
def process_exception(self, request, exception):
print >> sys.stderr, "exception has been raised"
# Get the exception info now, in case another exception is thrown later.
if isinstance(exception, http.Http404):
return self.handle_404(request, exception)
else:
return self.handle_500(request, exception)
settings.py
MIDDLEWARE_CLASSES = (
'vertical.middleware.HandleExceptionsMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
答案 0 :(得分:0)
中间件在响应阶段以反向顺序运行,其中 包括process_exception。如果异常中间件返回一个 响应,中间件上面的中间件类不会 完全被召唤。
答案 1 :(得分:0)
下面的清单帮助我解决了类似的问题:
MIDDLEWARES
中的python虚线路径MIDDLEWARES
的底部如果仍然无法正常工作,则意味着其他中间件捕获异常并返回响应,或者其他中间件调用视图的顺序混乱或太早。
None
view_func
中调用process_view