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

Django - 自定义 403 模板

渲染 Jinja2 宏而不影响模板其余部分的内容

使用 Django 的模板引擎而不使用 Django 的其余部分

为啥 django 模板渲染字典这么慢?

Django模板渲染