Django HTTP 500错误

时间:2013-02-06 14:55:39

标签: python django http templates

我正在创建自定义HTTP 500错误模板。为什么Django在我引发异常时显示它而不是在我返回HttpResponseServerError时(我只是得到默认的浏览器500错误)?我发现这种行为很奇怪......

4 个答案:

答案 0 :(得分: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时,内容为空,浏览器将回退到默认页面。

答案 1 :(得分: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放入模板中。就像那样简单。

答案 2 :(得分:0)

您是否尝试过使用其他浏览器?您的自定义错误页面是否大于512字节?当服务器的答案短于512字节时,似乎某些浏览器(包括Chrome)会将错误页面替换为自己的页面。

答案 3 :(得分:0)

从Django 2+开始,您需要做的就是将相应的错误模板放入基本模板文件夹中。 Django将在呈现默认值之前自动呈现它们。

https://docs.djangoproject.com/en/2.0/ref/views/#error-views

在您的情况下,只需将模板“ 500.html”(或“ 404.html”)放入/ templates