Django-rest-framework: JSONRenderer não retorna uma resposta json válida quando `data=None`

Criado em 13 jun. 2018  ·  4Comentários  ·  Fonte: encode/django-rest-framework

Passos para reproduzir

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

Comportamento esperado

Um corpo de resposta json válido como null ou {}

Comportamento real

Nenhum cabeçalho Content-Type definido e uma resposta vazia é retornada - particularmente dolorosa ao fazer solicitações com ajax() do jquery. Ele lança um erro de análise e rejeita a promessa em uma resposta de sucesso com um corpo vazio. Veja aqui https://stackoverflow.com/a/6186905

PR aqui: https://github.com/encode/django-rest-framework/pull/6027

Comentários muito úteis

Parece que o cabeçalho Content-Type foi excluído em uma resposta de renderizador vazia (linha 80)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Todos 4 comentários

Apenas um esclarecimento rápido.. Posso não estar recriando sua configuração exata, mas um teste rápido e manual mostra que o cabeçalho Content-Type está definido corretamente como application/json .

Quanto à resposta vazia, estou inclinado a concordar com @kltdwrds. Eu não sei se a especificação permite que um corpo vazio, porém, tanto de JavaScript JSON.parse e do Python json.loads não conseguem decodificar uma string vazia.

Ou seja, data=None deve ser codificado como null .


Pensando bem, o comportamento atual faz sentido. Embora JSON.parse e json.loads falhem, é responsabilidade do cliente verificar o tipo de conteúdo antes de analisar. Se alguma coisa, isso é um bug no jQuery.

hum estou usando

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

Não tenho certeza de onde o cabeçalho Content-Type é definido, mas acabei de confirmar que está faltando nas respostas usando o exemplo acima.

Parece que o cabeçalho Content-Type foi excluído em uma resposta de renderizador vazia (linha 80)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Nosso comportamento atual para return Response() é intencional. Embora retornar null também seja válido, é mais comum precisarmos de uma maneira de retornar uma resposta vazia sem tipo de conteúdo. Eu provavelmente preferiria deixar as coisas como estão por enquanto.

Esta página foi útil?
0 / 5 - 0 avaliações