我有一个网站,手工编辑一些页面。当缺少其中一个模板时,它只是意味着页面不存在,所以我想显示错误404.
相反,我得到一个例外TemplateDoesNotExist。
有没有办法让Django在找不到模板时显示错误404?
答案 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吗?