我正在创建一个自定义的HTTP 500错误模板。为什么Django会在我引发异常时显示它,而不是在我返回HttpResponseServerError时显示(我只是得到了默认的browser 500错误)?我觉得这种行为很奇怪。
发布于 2013-02-06 23:15:54
HttpResponseServerError继承自HttpResponse,实际上非常简单:
class HttpResponseServerError(HttpResponse):
status_code = 500那么让我们来看一下HttpResponse构造函数:
def __init__(self, content='', *args, **kwargs):
super(HttpResponse, self).__init__(*args, **kwargs)
# Content is a bytestring. See the `content` property methods.
self.content = content如您所见,默认情况下content为空。
现在,让我们看看Django本身是如何调用它的(摘自django.views.defaults):
def server_error(request, template_name='500.html'):
"""
500 error handler.
Templates: :template:`500.html`
Context: None
"""
try:
template = loader.get_template(template_name)
except TemplateDoesNotExist:
return http.HttpResponseServerError('<h1>Server Error (500)</h1>')
return http.HttpResponseServerError(template.render(Context({})))正如您所看到的,当您生成服务器错误时,将使用名为500.html的模板,但是当您只返回HttpResponseServerError时,内容是空的,浏览器将返回到其默认页面。
发布于 2013-02-06 23:23:28
将此内容放在urls.py中。
#handle the errors
from django.utils.functional import curry
from django.views.defaults import *
handler500 = curry(server_error, template_name='500.html')将500.html放入模板中。就是这么简单。
发布于 2013-02-06 23:01:54
你有没有尝试过其他浏览器?您的自定义错误页是否大于512字节?当服务器的答案小于512字节时,一些浏览器(包括Chrome)似乎会用自己的页面替换错误页面。
https://stackoverflow.com/questions/14731988
复制相似问题