9

カスタムHTTP500エラーテンプレートを作成しています。HttpResponseServerErrorを返したときではなく、例外を発生させたときにDjangoが表示するのはなぜですか(デフォルトのブラウザー500エラーが発生するだけです)。この振る舞いは奇妙だと思います...

4

4 に答える 4

11

The HttpResponseServerError inherits from HttpResponse and is actually quite simple:

class HttpResponseServerError(HttpResponse):
    status_code = 500

So let's look at the HttpResponse constructor:

def __init__(self, content='', *args, **kwargs):
    super(HttpResponse, self).__init__(*args, **kwargs)
    # Content is a bytestring. See the `content` property methods.
    self.content = content

As you can see by default content is empty.

Now, let's take a look at how it is called by Django itself (an excerpt from 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-06T15:15:54.133 に答える
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を入れます。そのように単純です。

于 2013-02-06T15:23:27.830 に答える
1

Have you tried with another browser ? Is your custom error page larger than 512 bytes ? It seems some browsers (including Chrome) replace errors page with their own when the server's answer is shorter than 512 bytes.

于 2013-02-06T15:01:54.487 に答える
0

Django 2+の時点で、あなたがする必要があるのは、対応するエラーテンプレートをベーステンプレートフォルダに置くことだけです。Djangoは、デフォルトをレンダリングする前にそれらを自動的にレンダリングします。

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

あなたの場合は、テンプレート「500.html」(または「404.html」)を/templatesにドロップするだけです。

于 2019-03-29T08:07:08.393 に答える