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

Django自定义500错误模板无法渲染问题求助

自定义500错误模板在Django生产环境(Heroku)无法渲染的问题

线上环境显示基础错误模板:

500 Internal Server Error
Exception inside application.

Daphne

补充说明:本地将dev.py的DEBUG设为False时,自定义模板可正常渲染。


现有配置

应用级views.py(main应用)

def custom_500(request):
    return render(request,'main/500.html', status=500)

模板路径

自定义模板位于 templates->main->500.html

项目级urls.py

from main.views import custom_400, custom_500
from django.conf.urls import handler500, handler400
handler500 = 'main.views.custom_500'

环境配置文件staging.py

DEBUG = False
ALLOWED_HOSTS = ['domainname.com' ]
SECURE_SSL_REDIRECT = True

注:settings文件夹下还有base.py,未发现异常配置


已执行的排查步骤

在Heroku应用shell中执行以下命令,结果均符合预期:

print(settings.ALLOWED_HOSTS) # 返回域名
print(settings.DEBUG) # 返回false
print(os.getenv('DJANGO_SETTINGS_MODULE')) # mysite.settings.staging
print(settings.CSRF_COOKIE_SECURE) # true
print(settings.SECURE_SSL_REDIRECT) # true

手动测试模板渲染,结果正常:

>>> from django.shortcuts import render 
>>> from django.test import RequestFactory
>>> request = RequestFactory().get('/')
>>> render(request,'main/500.html', status=500)

#返回: <HttpResponse status_code=500, "text/html; charset=utf-8">

解决建议

  • 检查ASGI(Daphne)配置:当前显示的是Daphne的默认错误页,可能ASGI层未将错误传递到Django的handler500。确认asgi.py中是否正确初始化Django应用,确保错误处理流程能触发自定义视图。
  • 验证模板与静态文件加载:线上环境需确保模板已被正确识别,检查settings.TEMPLATES配置:确认main应用在INSTALLED_APPS中,且APP_DIRS=True;同时确保部署时执行了python manage.py collectstatic(Heroku可通过Procfile配置自动执行)。
  • 排查错误触发场景:线上的500错误可能发生在Django处理请求之前(如ASGI层、中间件前置阶段),这类错误不会触发自定义handler500。可以写一个测试视图主动抛出异常(如raise Exception()),访问该视图验证是否能渲染自定义模板,判断问题是否为特定场景导致。
  • 查看应用日志:通过heroku logs --tail查看详细错误日志,定位触发500的具体异常和发生阶段,确认是否属于Django应用内部错误。
  • 调整handler加载顺序:将项目级urls.py中的handler500配置移至文件顶部,确保Django启动时优先加载该配置,避免导入顺序问题导致未生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:20:03