Django:如何在模板渲染过程中捕获基于类的视图中的特定异常?

时间:2014-11-30 06:20:51

标签: python django django-templates

如何在基于类的视图中捕获Django模板期间的特定异常?

我有一个自定义异常ImmediateHttpResponse,用于在我的基于类的视图中立即重定向。我试过了:

def dispatch(self, *args, **kwargs):
    try:
        return super(AppConnectionsView, self).dispatch(*args, **kwargs)
    except ImmediateHttpResponse as e:
        return HttpResponseRedirect(e.response)

我试图捕获的异常是在模板标记中引发的,因此似乎异常被django的模板调试拦截,我得到模板渲染错误HttpResponseRedirect no exception supplied。我仍然想调试我的模板,而不是在引发HttpResponseRedirect时。

请保留所有关于不在模板标签中引发错误的评论...我有一个非常好的理由。

1 个答案:

答案 0 :(得分:2)

如果你真的不惜一切代价去做,这是一个简单的解决方案:

def dispatch(self, *args, **kwargs):
    response = super(AppConnectionsView, self).dispatch(*args, **kwargs)
    try:
        response.render()
    except ImmediateHttpResponse as e:
        return HttpResponseRedirect(e.response)
    return response

您无法在视图中捕获渲染错误的原因是因为尽管在视图中创建了响应,但它实际上由BaseHandler呈现,它会适当地处理所有错误。上述解决方案的缺点是它将根据请求呈现模板两次。

能够捕获自定义错误的唯一其他方法是自定义BaseHandler(或其导数,如WSGIHandler),这显然会消除双重渲染问题。

假设你正在使用wsgi,你可能应该:)你可以这样做:

import django
from django.utils import six
from django.core.handlers.wsgi import WSGIHandler as DjangoWSGIHandler
from my_app.exceptions import ImmediateHttpResponse

class WSGIHandler(DjangoWSGIHandler):
    def handle_uncaught_exception(self, request, resolver, exc_info):
        (type, value, traceback) = exc_info
        if type is not None and issubclass(type, ImmediateHttpResponse):
            six.reraise(*exc_info)
        return super(WSGIHandler, self).handle_uncaught_exception(
            request, resolver, exc_info)

def get_wsgi_application():
    django.setup()
    return WSGIHandler()

现在您可以在wsgi.py

中使用此功能
application = get_wsgi_application()