Django 渲染模板 `500.html` 而不是 `404.html`
Posted
技术标签:
【中文标题】Django 渲染模板 `500.html` 而不是 `404.html`【英文标题】:Django renders the template `500.html` instead of `404.html` 【发布时间】:2013-06-27 06:23:50 【问题描述】:在我的一个观点中,我有代码:
raise Http404
当DEBUG=False
Django 渲染模板500.html
而不是正确的404.html
!我不明白为什么!
编辑:当DEBUG=True
我得到标准的(由 Django)
Page not Found (404)
You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
更重要的是,在runserver
控制台中,我清楚地看到了404
代码。 相反,在控制台中设置DEBUG=False
时,我得到500
!!这太奇怪了。
编辑 2:如果我在提出 Http404
之前放置一个打印语句,我会在 DEBUG=True
时看到消息,但在 False
时看不到消息!
编辑 3:我可以确认当 DEBUG=False
声明 raise Http404
永远不会到达。怎么可能??
更新
实际上,DEBUG=False
在每个 URL 上我都会得到 500。而 DEBUG=True
不会发生这种情况。怎么可能??它应该运行相同。我开始认为这是一个 Django 错误。
【问题讨论】:
一个原因可能是因为您的 400.html 模板生成了 500 错误,您可以发布您的模板吗? 那么 DEBUG=True 会发生什么? @maazza:我对此表示怀疑。我创建了一个新的 404.html 并在其中写入了 404。然而,它没有被渲染。 @brunodesthuilliers:见我的编辑。 您的 404.html 可能没有放在正确的位置? 【参考方案1】:您的 debug=false 错误可能是由于 allowed_hosts 设置造成的。
见:Setting DEBUG = False causes 500 Error
这是 django 1.5 中的新功能
生产中需要 ALLOWED_HOSTS
新的 ALLOWED_HOSTS 设置验证请求的 Host 标头和 防止主机中毒攻击。现在需要此设置 只要 DEBUG 为 False,否则 django.http.HttpRequest.get_host() 将引发 SuspiciousOperation。欲了解更多详情,请参阅完整 新设置的文档。
https://docs.djangoproject.com/en/1.5/releases/1.5/#allowed-hosts-required-in-production
【讨论】:
我有错误,但不是在所有页面中,只有在 http404 引发错误的页面上存在以上是关于Django 渲染模板 `500.html` 而不是 `404.html`的主要内容,如果未能解决你的问题,请参考以下文章
Django 自定义 500 错误模板不显示 request.user