Як я можу повернути код стану HTTP 204 з подання Django?


82

Я хочу повернути код стану 204 No Contentз подання Django. Це у відповідь на автоматичний POST, який оновлює базу даних, і мені просто потрібно вказати, що оновлення було успішним (без перенаправлення клієнта).

Є підкласи HttpResponseдля обробки більшості інших кодів, але не 204.

Який найпростіший спосіб це зробити?


Я раніше цього не робив, але чи намагалися ви встановити атрибут status об'єкта відповіді, перш ніж повертати відповідь із вашого перегляду? Крім того, ось ще одне SO-питання щодо цього: stackoverflow.com/questions/408541/…
alan

Відповіді:


173
return HttpResponse(status=204)

4
Дякую. W3C стверджує: "Відповідь 204 НЕ ПОВИНЕН включати тіло повідомлення", тому (якщо припустити, що параметр вмісту відображається в тілі повідомлення), він повинен бути порожнім, правда?
Flash

1
Для тих, хто читає, а не лише про код 204, ви можете використовувати тіло повідомлення за допомогою методів HTTPResponse від Django.
Брейден Холт


20

Або те, що відповів Стів Мейн, або побудуйте власне, підкласувавши 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 для переспрямування було б дуже дивним, якщо воно взагалі працює).
Марк

О .. Чи є спосіб передати стан помилки, не перезавантажуючи сторінку та не перенаправляючи на нову сторінку? Я хочу використовувати його, коли файл, який користувач намагається зберегти, уже існує. Я спробував 409 і 422. Але вони перенаправляють їх на нову сторінку. Я знаю, що AJAX - інше рішення. Але цікавився, чи є у Джанго якийсь фокус.
GobSmack

1
Коди стану використовуються, коли відвідувачі завантажують сторінку. Тож вони повинні вже завантажувати сторінку; зміна коду не спричиняє додаткового перенаправлення, але ви все одно завантажуєте нову сторінку. Якщо вони знаходяться на сторінці, і ви хочете повідомити їх без перезавантаження, то я не думаю, що існує спосіб оновити код поточної сторінки (я думаю, це все одно було б надзвичайно корисно). Отже: якщо вони зберігають форму, яка спрямовує їх на нову сторінку, ви можете вибрати будь-який код стану для сторінки результатів. Якщо вона не завантажує нову сторінку, просто покажіть повідомлення та забудьте код стану.
Марк

Я розумію, що ти кажеш. Але мені дійсно потрібно просто оновити сторінку. Тож, мабуть, мені доведеться використовувати AJAX + Django :( Хоча
дякую

0

Інші відповіді працюють здебільшого, але вони не дають повністю сумісних відповідей HTTP 204, оскільки вони все ще містять заголовок вмісту. Це може спричинити попередження WSGI і підхоплюється тестовими інструментами, такими як веб-тест Django.

Ось покращений клас відповіді 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.