如何让Django捕获TemplateDoesNotExistError时重定向到404页面?
Django将TemplateDoesNotExist错误重定向到404页面的实现方法
要让所有视图(包括内置的auth登录视图)在触发TemplateDoesNotExistError时返回404页面,而非500服务器错误,有两种常用实现方式:
方法一:自定义异常处理器
通过替换Django默认的500错误处理器,捕获模板不存在的异常并返回404响应:
- 在项目的任意app下(建议根app)创建或修改
views.py,添加自定义异常处理函数:
from django.shortcuts import render from django.template.loader import TemplateDoesNotExist from django.views.defaults import server_error def custom_error_handler(request, exception=None): # 捕获模板不存在异常 if isinstance(exception, TemplateDoesNotExist): # 返回自定义404页面,需提前在templates目录创建404.html return render(request, '404.html', status=404) # 其他异常沿用默认500错误处理逻辑 return server_error(request)
- 在项目
settings.py中配置替换默认的500处理器:
# 替换为自定义的错误处理函数路径 handler500 = 'your_project.your_app.views.custom_error_handler'
方法二:自定义中间件
利用Django中间件拦截视图执行过程中的异常,直接将模板不存在的异常转为404响应:
- 在项目根目录创建
middleware.py文件,编写中间件类:
from django.shortcuts import render from django.template.loader import TemplateDoesNotExist class TemplateNotFoundTo404Middleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): return self.get_response(request) def process_exception(self, request, exception): # 捕获模板不存在异常 if isinstance(exception, TemplateDoesNotExist): # 返回自定义404页面 return render(request, '404.html', status=404) # 其他异常交给后续中间件处理 return None
- 在项目
settings.py的MIDDLEWARE列表中添加该中间件:
MIDDLEWARE = [ # 保持原有中间件顺序,添加在合适位置(建议靠后) 'your_project.middleware.TemplateNotFoundTo404Middleware', ]
测试验证
删除registration/login.html模板,访问登录页面,此时应返回自定义的404页面,而非500服务器错误。
内容的提问来源于stack exchange,提问作者Tom Huibregtse
相关产品推荐
相关产品推荐

