Django HTTP 500 错误
我正在制作一个自定义的HTTP 500错误模板。为什么在我抛出异常时,Django会显示这个模板,而当我返回HttpResponseServerError时却只显示浏览器默认的500错误页面?我觉得这个行为有点奇怪……
4 个回答
1
你有没有试过换个浏览器?你的自定义错误页面是不是大于512字节?好像有些浏览器(包括Chrome)会在服务器返回的内容少于512字节时,用它们自己的错误页面替换掉你的页面。
2
在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文件放到你的模板文件夹里。就这么简单。
11
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
,那么内容就是空的,浏览器就会显示它的默认页面。