从未调用过程异常的中间件

时间:2014-04-18 05:45:38

标签: python exception-handling django

我有这个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',
 )

2 个答案:

答案 0 :(得分:0)

  

中间件在响应阶段以反向顺序运行,其中   包括process_exception。如果异常中间件返回一个   响应,中间件上面的中间件类不会   完全被召唤。

答案 1 :(得分:0)

下面的清单帮助我解决了类似的问题:

  1. 检查中间件是否正确创建(refer to middleware docs
  2. 使用您正在使用的中间件检查MIDDLEWARES中的python虚线路径
  3. 检查中间件是否位于MIDDLEWARES的底部

如果仍然无法正常工作,则意味着其他中间件捕获异常并返回响应,或者其他中间件调用视图的顺序混乱或太早。

  1. 检查您的其他中间件是否正在显式或隐式返回None
  2. 检查您的其他中间件是否没有直接在view_func中调用process_view