Django HTTP 500 错误

9 投票
4 回答
20816 浏览
提问于 2025-04-17 14:58

我正在制作一个自定义的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,那么内容就是空的,浏览器就会显示它的默认页面。

撰写回答