我有一个设置handler500
的django应用程序。我想为它添加自定义异常处理程序。
我创建了一个处理进程异常的中间件:
Django在视图引发异常时调用process_exception()。 process_exception()应返回None或HttpResponse对象。如果它返回一个HttpResponse对象,则响应将返回给浏览器。否则,默认的异常处理就会启动。
https://docs.djangoproject.com/en/dev/topics/http/middleware/?from=olddocs#process-exception
我的ErrorMiddleware
看起来像是:
class ErrorMiddleware(object):
def process_exception(self, request, exception):
try:
#logic goes here
except Exception:
pass
return None
我的settings
看起来像是:
MIDDLEWARE_CLASSES = (
'my.error.ErrorMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
DEBUG = False
在这种情况下,我的浏览器永远不会从具有异常的页面获得响应。虽然列表中没有我的中间件,但我handler500
正常工作。
我希望执行默认的异常处理机制,而不在我的中间件中显式调用handler500
视图。
UPD :
handler500模块如下所示:
#imports ....
def custom_500(request):
""" Return an error ID (hash) that can be provided to support """
return render(request, '500.html', {
'timestamp': datetime.datetime.now().isoformat(),
'diagcode': "hello",
}
)
答案 0 :(得分:5)
尝试将您的中间件移动到MIDDLEWARE_CLASSES
堆栈的底部,这样它就是第一个在向客户端发出请求时处理请求的中间件。我相信Django已经捕获了你的异常,并且如果你把它放在最后那么它会产生自己的错误500页。