如何从Django视图返回HTTP状态代码204?


81

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

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

最简单的方法是什么?


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

Answers:



20

Steve Mayne回答了什么,或者通过子类化HttpResponse构建了自己的:

from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = 204

def my_view(request):
    return HttpResponseNoContent()

18

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

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

(请注意,对于状态204,不应有响应主体,但此方法对其他状态代码很有用。)


这不会导致重定向吗?
GobSmack

无需重定向,它应该与顶级答案相同,只是语法较短。(使用状态代码204进行重定向将非常奇怪,如果它可以工作的话)。
2015年

哦..有没有一种方法可以传递错误状态而无需实际重新加载页面或重定向到新页面?当用户尝试保存的文件已经存在时,我想使用它。我尝试了409和422。但是,他们将其重定向到新页面。我知道AJAX是另一种解决方案。但是想知道Django是否有任何技巧。
GobSmack

1
访问者加载页面时使用状态码。因此,他们必须已经在加载页面。更改代码不会导致额外的重定向,但是您仍在加载新页面。如果它们在页面上,并且您想在不重新加载的情况下通知它们,那么我认为没有办法更新当前页面的代码(无论如何,我认为它不会非常有用)。因此:如果他们保存将其发送到新页面的表单,则可以为结果页面选择任何状态代码。如果未加载新页面,则仅显示消息而忘记状态码。
2015年

我明白你的意思。但是,我真的需要只更新页面。所以,我想,我将不得不使用AJAX + Django :(不过,非常感谢!
GobSmack 2015年

0

其他答案大多数情况下都起作用,但是它们仍未生成完全兼容的HTTP 204响应,因为它们仍包含内容标头。这可能会导致WSGI警告,并被Django Web Test之类的测试工具识别。

这是用于HTTP 204响应的改进类。(基于此Django票证):

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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.