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

Django自定义404页面未生效求助:生产与本地显示异常

解决Django自定义404页面不生效的问题

看起来你遇到的是Django自定义错误页面不生效的典型场景,我帮你拆解几个关键排查点:

1. 模板位置放错了!

Django在DEBUG=False时查找404模板的逻辑是:直接在已安装APP的templates根目录,或项目全局templates根目录下找404.html,不会去APP命名空间的子目录(比如你现在的app/templates/app/404.html)。

你需要把404.html移到以下两个位置之一:

  • 项目根目录的templates文件夹下:templates/404.html
  • 你的APP的templates根目录下:app/templates/404.html(去掉内层的app子文件夹)

2. 检查模板加载配置是否正确

打开settings.py里的TEMPLATES配置块,确保:

  • APP_DIRS设置为True(这样Django会自动扫描每个已安装APP的templates目录)
  • 如果用了项目全局templates,要在DIRS里添加路径:
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [BASE_DIR / 'templates'],  # 确保这行存在
            'APP_DIRS': True,
            # ... 其他配置
        },
    ]
    

3. 生产环境的「Internal Server Error」是另一个问题

当DEBUG=False时,Django要求必须配置ALLOWED_HOSTS,如果访问的域名不在这个列表里,会直接抛出500错误(也就是你看到的「Internal Server Error」),根本到不了404的处理逻辑。

赶紧去settings.py里配置生产环境的允许域名:

ALLOWED_HOSTS = ['your-production-domain.com', 'www.your-production-domain.com']

(测试阶段可以临时用ALLOWED_HOSTS = ['*'],但正式生产千万别这么做)

4. 排查生产环境Web服务器的拦截

如果用Nginx/Apache这类反向代理,可能服务器自身会先返回默认404,而不是把请求转发给Django。以Nginx为例,要确保配置里有类似这样的规则,让所有不存在的路径都交给Django处理:

location / {
    try_files $uri $uri/ @django;
}

location @django {
    uwsgi_pass unix:/path/to/your/uwsgi.sock;
    include uwsgi_params;
}

最后验证你的404模板代码

你的模板代码本身是没问题的:

{% extends "app/base.html" %} 
{% block page_header %} 
<h1>404</h1> 
<h2>The page you requested is not available.</h2> 
<i class="far fa-meh"></i> 
{% endblock page_header %}

只要app/base.html的路径正确(也就是app/templates/app/base.html),移动位置后就能正常继承渲染。

按照上面的步骤逐一排查,应该就能解决问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:02:59