Django-rest-framework: JSONRenderer не возвращает допустимый ответ json, когда `data=None`

Созданный на 13 июн. 2018  ·  4Комментарии  ·  Источник: encode/django-rest-framework

Действия по воспроизведению

@permission_classes((AllowAny, ))
class Viewset(viewsets.ViewSet):
    renderer_classes = (JSONRenderer, )
    def list(self, request, *args, **kwargs):
        return Response()

Ожидаемое поведение

Действительный текст ответа json, например null или {}

Фактическое поведение

Заголовок Content-Type установлен, и возвращается пустой ответ, что особенно болезненно при выполнении запросов с помощью jquery ajax() . Он выдает ошибку синтаксического анализа и отклоняет обещание об успешном ответе с пустым телом. Смотрите здесь https://stackoverflow.com/a/6186905

Пиар здесь: https://github.com/encode/django-rest-framework/pull/6027

Самый полезный комментарий

Похоже, что заголовок Content-Type удален в пустом ответе рендерера (строка 80).
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Все 4 Комментарий

Просто быстрое уточнение. Возможно, я не воссоздаю вашу точную настройку, но быстрый ручной тест показывает, что заголовок Content-Type правильно установлен на application/json .

Что касается пустого ответа, я склонен согласиться с @kltdwrds. Я не знаю , если спецификация позволяет пустое тело, однако, как JavaScript - х JSON.parse и Питона json.loads не декодировать пустую строку.

То есть data=None следует кодировать как null .


Если подумать, текущее поведение имеет смысл. Хотя JSON.parse и json.loads действительно терпят неудачу, клиент обязан проверить тип содержимого перед синтаксическим анализом. Во всяком случае, это ошибка в jQuery.

хм, я использую

from rest_framework import viewsets
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response

Не уверен, где устанавливается заголовок Content-Type , но я только что подтвердил, что он отсутствует в ответах, используя приведенный выше пример.

Похоже, что заголовок Content-Type удален в пустом ответе рендерера (строка 80).
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Наше текущее поведение для return Response() является преднамеренным. Хотя возвращение null также допустимо, более типичным является то, что нам нужен способ вернуть пустой ответ без типа содержимого. Я, наверное, лучше пока оставлю все как есть.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги