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
相关产品推荐
相关产品推荐

