Django在丢失的模板上显示404

时间:2011-05-08 08:56:29

标签: django http-status-code-404

我有一个网站,手工编辑一些页面。当缺少其中一个模板时,它只是意味着页面不存在,所以我想显示错误404.

相反,我得到一个例外TemplateDoesNotExist。

  

有没有办法让Django在找不到模板时显示错误404?

3 个答案:

答案 0 :(得分:12)

如果您希望对您网站上的所有视图采取此行为,则可能需要使用process_exception方法编写自己的中间件。

from django.template import TemplateDoesNotExist
from django.views.defaults import page_not_found

class TemplateDoesNotExistMiddleware(object):
    """ 
    If this is enabled, the middleware will catch
    TemplateDoesNotExist exceptions, and return a 404
    response.
    """

    def process_exception(self, request, exception):
        if isinstance(exception, TemplateDoesNotExist):
            return page_not_found(request)

如果您已定义自己的handler404,则需要替换上面的page_not_found。我不能立即确定如何将字符串handler404转换为中间件所需的可调用对象。

要启用中间件,请将其添加到MIDDLEWARE_CLASSES中的settings.py。小心添加它的位置。标准的Django中间件警告适用:

  

同样,中间件在响应阶段以相反的顺序运行,其中包括process_exception。如果异常中间件返回响应,则根本不会调用该中间件之上的中间件类。

答案 1 :(得分:9)

在try-except块中将响应的返回放在视图中(或者在模板呈现的时候):

from django.http import Http404
from django.shortcuts import render_to_response
from django.template import TemplateDoesNotExist

def the_view(request):
    ...
    try:
        return render_to_response(...)
    except TemplateDoesNotExist:
        raise Http404

答案 2 :(得分:-1)

离开我的头顶,但是如果你在你的设置中设置了DEBUG = False,那么你不会在每个错误(包括TemplateNotFound)上得到404吗?