【问题标题】:How can I return HTTP status code 204 from a Django view?如何从 Django 视图返回 HTTP 状态代码 204?
【发布时间】:2012-09-10 16:25:13
【问题描述】:

我想从 Django 视图返回状态码 204 No Content。这是对更新数据库的自动 POST 的响应,我只需要表明更新成功(无需重定向客户端)。

HttpResponse 的子类可以处理大多数其他代码,但不能处理 204。

最简单的方法是什么?

【问题讨论】:

  • 我以前没有这样做过,但是您是否尝试在从视图返回响应之前设置响应对象的状态属性?此外,这是另一个关于此的 SO 问题:stackoverflow.com/questions/408541/…

标签: django


【解决方案1】:
return HttpResponse(status=204)

【讨论】:

  • 谢谢。 W3C 声明“204 响应不得包含消息正文”,因此(假设内容参数映射到消息正文)它应该是空白的,对吧?
  • 对于那些不只关心 204 代码的读者,您可以使用带有 Django 的 HTTPResponse 方法的消息体。
【解决方案2】:

史蒂夫梅恩回答了什么,或者通过继承 HttpResponse 来构建你自己的:

from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = 204

def my_view(request):
    return HttpResponseNoContent()

【讨论】:

    【解决方案3】:

    当使用render 时,有一个status 关键字参数。

    return render(request, 'template.html', status=204)
    

    (请注意,在状态 204 的情况下不应该有响应正文,但此方法对其他状态代码很有用。)

    【讨论】:

    • 这不会导致重定向吗?
    • 不需要重定向,它应该与最佳答案相同,只是语法更短。 (使用状态码 204 进行重定向会很奇怪,如果它确实有效的话)。
    • 哦.. 有没有办法可以在不重新加载页面或重定向到新页面的情况下传递错误状态?当用户尝试保存的文件已经存在时,我想使用它。我尝试了 409 和 422。但是,他们将其重定向到新页面。我知道 AJAX 是另一种解决方案。但想知道 Django 是否有任何技巧。
    • 访问者加载页面时使用状态码。所以他们必须已经在加载一个页面;更改代码不会导致额外的重定向,但您仍在加载新页面。如果他们在一个页面上,并且您想在不重新加载的情况下通知他们,那么我认为没有办法更新当前页面的代码(无论如何我认为它不会非常有用)。所以:如果他们保存了一个将他们发送到新页面的表单,那么您可以为结果页面选择任何状态代码。如果它没有加载新页面,只需显示消息并忘记状态代码。
    • 我明白你在说什么。但是,我真的需要更新页面。所以,我想,我将不得不使用 AJAX + Django :( 非常感谢!
    【解决方案4】:

    其他答案大多有效,但它们不会产生完全符合 HTTP 204 的响应,因为它们仍然包含内容标头。这可能会导致 WSGI 警告,并被 Django Web Test 等测试工具检测到。

    这是一个改进的符合 HTTP 204 响应的类。 (基于此Django ticket):

    from django.http import HttpResponse
    
    class HttpResponseNoContent(HttpResponse):
        """Special HTTP response with no content, just headers.
    
        The content operations are ignored.
        """
    
        def __init__(self, content="", mimetype=None, status=None, content_type=None):
            super().__init__(status=204)
    
            if "content-type" in self._headers:
                del self._headers["content-type"]
    
        def _set_content(self, value):
            pass
    
        def _get_content(self, value):
            pass
    
    def my_view(request):
        return HttpResponseNoContent()
    

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 2011-11-18
      • 2012-11-14
      • 1970-01-01
      • 2021-07-27
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多