Django 뷰에서 HTTP 상태 코드 204를 반환하려면 어떻게해야합니까?


82

204 No ContentDjango 뷰에서 상태 코드를 반환하고 싶습니다 . 데이터베이스를 업데이트하는 자동 POST에 대한 응답이며 클라이언트를 리디렉션하지 않고 업데이트가 성공했음을 나타내기만하면됩니다.

HttpResponse대부분의 다른 코드를 처리 하는 하위 클래스가 있지만 204는 없습니다.

이를 수행하는 가장 간단한 방법은 무엇입니까?


전에이 작업을 수행 한 적이 없지만보기에서 응답을 반환하기 전에 응답 개체의 상태 속성을 설정해 보셨습니까? 또한 이것에 대한 또 다른 질문이 있습니다 : stackoverflow.com/questions/408541/…
alan

답변:


173
return HttpResponse(status=204)

4
감사. W3C는 "204 응답은 메시지 본문을 포함해서는 안됩니다."라고 명시하므로 (내용 매개 변수가 메시지 본문에 매핑된다고 가정) 공백이어야합니다. 맞습니까?
플래시

1
204 코드에만 관심이없는 사람을 위해 Django의 HTTPResponse 메서드와 함께 메시지 본문을 사용할 수 있습니다.
Braden Holt


20

Steve Mayne이 대답 한 내용 중 하나이거나 HttpResponse를 서브 클래 싱하여 직접 빌드하십시오.

from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = 204

def my_view(request):
    return HttpResponseNoContent()

19

사용하는 경우 렌더링 하는이 status키워드 인수입니다.

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

(상태 204의 경우 응답 본문이 없어야하지만이 메서드는 다른 상태 코드에 유용합니다.)


그래도 리디렉션이 발생하지 않습니까?
GobSmack

리디렉션이 필요하지 않으며 상위 답변과 동일해야하며 구문이 짧아야합니다. (리디렉션을 위해 상태 코드 204를 사용하는 것은 작동한다면 매우 이상 할 것입니다.)
Mark

아 .. 실제로 페이지를 다시로드하거나 새 페이지로 리디렉션하지 않고 오류 상태를 전달할 수있는 방법이 있습니까? 사용자가 저장하려는 파일이 이미 존재하는 경우 사용하고 싶습니다. 나는 409 & 422를 시도했다. 그러나 그들은 그것을 새 페이지로 재지 정한다. AJAX가 다른 솔루션이라는 것을 알고 있습니다. 하지만 장고에 어떤 트릭이 있는지 궁금했습니다.
GobSmack 2015

1
방문자가 페이지를로드 할 때 상태 코드가 사용됩니다. 따라서 이미 페이지를로드하고 있어야합니다. 코드를 변경해도 추가 리디렉션이 발생하지는 않지만 여전히 새 페이지를로드하고 있습니다. 그들이 페이지에 있고 새로 고침하지 않고 알려주고 싶다면 현재 페이지의 코드를 업데이트하는 방법이 없다고 생각합니다 (어쨌든별로 유용하지 않을 것 같습니다). 따라서 새 페이지로 보내는 양식을 저장하면 결과 페이지에 대한 상태 코드를 선택할 수 있습니다. 새 페이지가로드되지 않으면 메시지를 표시하고 상태 코드는 잊어 버리십시오.
Mark

나는 당신이 말하는 것을 이해합니다. 하지만 정말 페이지를 업데이트해야합니다. 그래서, 그런 것 같아요, 그래도 난 AJAX + 장고 :( 감사를 많이 사용해야합니다!
GobSmack

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.