我有这个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.朋友
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',
)
中间件在响应阶段以相反的顺序运行,其中包括process_exception。如果异常中间件返回响应,则根本不会调用该中间件之上的中间件类。
以下清单帮助我解决了类似的问题:
MIDDLEWARES
中的python虚线路径MIDDLEWARES
的底部如果仍然无法正常工作,则意味着其他中间件会捕获异常并返回响应,或者其他中间件无法按顺序或过早地调用您的视图。
None
(显式或隐式)view_func
中直接调用process_view