使用@require_POST时如何在Django中显示HTTP状态405(方法不允许)的自定义错误页面
Posted
技术标签:
【中文标题】使用@require_POST时如何在Django中显示HTTP状态405(方法不允许)的自定义错误页面【英文标题】:How to display a custom error page for HTTP status 405 (method not allowed) in Django when using @require_POST 【发布时间】:2011-06-04 14:21:47 【问题描述】:我的问题很简单,当使用@require_POST
装饰器时,如何在 Django 中显示 HTTP 状态 405(不允许方法)的自定义错误页面?
我正在使用django.views.decorators.http.require_POST
装饰器,当 GET 请求访问页面时,控制台显示 405 错误,但页面只是空白(甚至不是 Django 错误页面)。如何让 Django 针对此类错误显示自定义和/或默认错误页面?
编辑:
值得一提的是,我尝试将 404.html、500.html 和 405.html 页面放在我的模板文件夹中 - 但这也无济于事。我也在DEBUG = True
和False
之间切换,但无济于事。
【问题讨论】:
【参考方案1】:您必须编写自定义 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/
【讨论】:
谢谢 - 现在看起来很明显!但是比我预想的麻烦多了。 这是一个有用的响应,但它不再适用于我在 Django 1.11 上。我不得不使用response.content = loader.render_to_string("405.html", request=request)
并且不能再使用(或不得不使用)上下文。【参考方案2】:
如果您查看documentation 和 django.views.defaults 的源代码,您会发现仅支持 404 和 500 错误,您只需添加 404.html 即可。 500.html 到你的模板目录。
在文档中。您还可以阅读以下内容
在 Django 中返回 HTTP 错误代码 简单。有以下子类 HttpResponse 为一些常见的 200 以外的 HTTP 状态代码 (这意味着“好的”)。你可以找到 可用子类的完整列表 请求/响应文档。
因此如果要返回 405 错误,则必须使用 HttpResponseNotAllowed class
example
【讨论】:
恐怕你没有回答这个问题 - 问题不是返回 405 状态 - 问题是在使用 @require_POST 装饰器时显示该响应的模板。 你是对的,错过了你使用装饰器的信息。【参考方案3】:我不确定这是否可能。也许您应该考虑提交错误报告。
【讨论】:
好吧,我们现在知道这是可能的。但这绝不是为 404 和 500 添加页面那么简单。考虑到 @require_POST 等有一个内置的装饰器,人们会期望它更容易。以上是关于使用@require_POST时如何在Django中显示HTTP状态405(方法不允许)的自定义错误页面的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Django 没有 405 的错误页面处理程序 - 方法不允许?
Django - 如何在使用 django-bootstrap-toolkit 登录(或)注册时验证用户身份?
使用 Django 时如何在 MongoDB 中使用不同的键名?
Instagram 在使用 Django 时如何在服务器上呈现 React 视图? [关闭]