在Django中使用@require_POST时,如何显示一个自定义的HTTP状态405(方法不允许)错误页面?

12
我的问题很简单,当使用@require_POST装饰器时,在Django中如何显示HTTP状态405(方法不允许)的自定义错误页面?
我正在使用django.views.decorators.http.require_POST装饰器,当页面被GET请求访问时,控制台会显示405错误,但页面仅是空白(甚至没有Django错误页面)。如何使Django显示这种类型错误的自定义和/或默认错误页面?
编辑:值得一提的是,我已经尝试在我的模板文件夹中放置404.html、500.html和405.html页面,但是这也没有帮助。我也尝试了DEBUG=TrueFalse之间的变化,但无济于事。
4个回答

14

您需要编写自定义Django中间件。您可以从以下中间件开始,并将其扩展为检查是否存在405.html文件等:

from django.http import HttpResponseNotAllowed
from django.template import RequestContext
from django.template import loader


class HttpResponseNotAllowedMiddleware(object):
    def process_response(self, request, response):
        if isinstance(response, HttpResponseNotAllowed):
            context = RequestContext(request)
            response.content = loader.render_to_string("405.html", context_instance=context)
        return response

如果你不知道如何安装中间件,请查看文档:

http://docs.djangoproject.com/en/dev/topics/http/middleware/

你也可以查看这篇文章:

http://mitchfournier.com/2010/07/12/show-a-custom-403-forbidden-error-page-in-django/


谢谢 - 现在看起来很明显!但比我预期的麻烦得多。 - Herman Schaaf
这是一个有帮助的回复,但在Django 1.11上它不再适用于我。我必须使用response.content = loader.render_to_string("405.html", request=request),而不再能够使用(或必须使用)上下文。 - jonespm

0

我在2022年来到这里。上面接受的答案对我不起作用。我使用Django Rest Framework。我的解决方案是创建一个中间件,其中包含

#app/middleware.py

from django.http import HttpResponse
from django.template import loader

class HttpResponseNotAllowedMiddleware:
    def __init__(self, get_response):
    self.get_response = get_response
    # One-time configuration and initialization.

def __call__(self, request):
    
    # Code to be executed for each request before
    # the view (and later middleware) are called.

    response = self.get_response(request)

    # Code to be executed for each request/response after
    # the view is called.
    if response.status_code == 405:
        context = {}
        template = loader.get_template('app/405.html')
        return HttpResponse(template.render(context, request))

    return response

然后通过将此添加到设置中进行安装

MIDDLEWARE = [
.......
'app.middleware.HttpResponseNotAllowedMiddleware',
]

405.html 模板只是一个简单的不允许文本


0

如果您查看文档和django.views.defaults的源代码,您会发现只支持404和500错误,您只需将404.html或500.html添加到您的模板目录中即可。

在文档中,您还可以阅读以下内容

在Django中返回HTTP错误代码很容易。除了200(表示“OK”)之外,还有许多常见的HTTP状态代码的HttpResponse子类。您可以在请求/响应文档中找到可用子类的完整列表。

因此,如果要返回405错误,则必须使用HttpResponseNotAllowed class

示例


恐怕你没有回答问题——问题不是返回405状态——问题是在使用@require_POST装饰器时显示该响应的模板。 - Herman Schaaf
你是对的,我错过了你正在使用装饰器的信息。 - Thomas Kremmel

0

我不确定这是可能的。也许你应该考虑提交一个错误报告。


我们现在知道这是可能的。但它绝不像添加404和500页面那样简单。考虑到@require_POST等内置装饰器,人们会期望它更容易些。 - Herman Schaaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接