Як я можу повернути код стану 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.