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

Django中如何覆盖HttpResponse404以显示自定义错误页面?

Django自定义404错误页面问题解决

核心问题分析

你遇到的情况有两个关键点:

  1. Django在DEBUG=True模式下会强制显示自带的调试页面,忽略你配置的自定义错误视图
  2. 直接返回HttpResponse404对象不会触发handler404配置的视图——handler404仅处理抛出的Http404异常

解决方案

1. 先确保调试模式关闭

要测试自定义错误页面,必须修改settings.py:

DEBUG = False
# 同时配置ALLOWED_HOSTS,比如允许所有域名(仅测试用)
ALLOWED_HOSTS = ['*']

开启生产模式后,Django才会使用你配置的handler4xx/5xx视图。

2. 处理直接返回HttpResponse404的场景

如果你习惯在视图里直接返回HttpResponse404而不是抛异常,有两种处理方式:

方式一:替换为抛出Http404异常(推荐)

这是Django的标准用法,会自动触发你配置的handler404视图:

from django.http import Http404

def your_view(request):
    # 替换原来的 return HttpResponse404()
    raise Http404("页面不存在")

方式二:自定义404响应类

如果一定要用返回响应的方式,可以继承HttpResponse404并自定义内容:

from django.http import HttpResponse404
from django.shortcuts import render

class Custom404Response(HttpResponse404):
    def __init__(self, request, message=None, *args, **kwargs):
        # 复用你已有的error.html模板和上下文
        context = {
            'status_code': 404,
            'message': message or "The page you were looking for doesn't exist anymore.",
            'title': "Page Not Found"
        }
        response_content = render(request, 'error.html', context=context).content
        super().__init__(response_content, *args, **kwargs)

# 在视图中使用
def your_view(request):
    return Custom404Response(request)

3. 确认现有错误视图配置的正确性

你当前的handler配置是正确的,注意:

  • handler500对应的视图不需要接收exception参数,你写的internal_server_error_view用*args, **argv兼容是没问题的
  • 所有错误视图必须返回带有对应状态码的响应(你已经做到了)

内容的提问来源于stack exchange,提问作者Chuen Yik Kang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:33:28