You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Django捕获TemplateDoesNotExistError时重定向到404页面?

Django将TemplateDoesNotExist错误重定向到404页面的实现方法

要让所有视图(包括内置的auth登录视图)在触发TemplateDoesNotExistError时返回404页面,而非500服务器错误,有两种常用实现方式:

方法一:自定义异常处理器

通过替换Django默认的500错误处理器,捕获模板不存在的异常并返回404响应:

  1. 在项目的任意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)
  1. 在项目settings.py中配置替换默认的500处理器:
# 替换为自定义的错误处理函数路径
handler500 = 'your_project.your_app.views.custom_error_handler'

方法二:自定义中间件

利用Django中间件拦截视图执行过程中的异常,直接将模板不存在的异常转为404响应:

  1. 在项目根目录创建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
  1. 在项目settings.py的MIDDLEWARE列表中添加该中间件:
MIDDLEWARE = [
    # 保持原有中间件顺序,添加在合适位置(建议靠后)
    'your_project.middleware.TemplateNotFoundTo404Middleware',
]

测试验证

删除registration/login.html模板,访问登录页面,此时应返回自定义的404页面,而非500服务器错误。

内容的提问来源于stack exchange,提问作者Tom Huibregtse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:02:26