Django-rest-framework: JSONRenderer no devuelve una respuesta json válida cuando `data=None`

Creado en 13 jun. 2018  ·  4Comentarios  ·  Fuente: encode/django-rest-framework

pasos para reproducir

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

Comportamiento esperado

Un cuerpo de respuesta json válido como null o {}

Comportamiento real

No se establece el encabezado Content-Type y se devuelve una respuesta vacía, lo que es particularmente doloroso cuando se realizan solicitudes con ajax() jquery. Lanza un parseerror y rechaza la promesa en una respuesta exitosa con un cuerpo vacío. Ver aquí https://stackoverflow.com/a/6186905

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

Comentario más útil

Parece que el encabezado Content-Type se elimina en una respuesta de renderizador vacía (línea 80)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Todos 4 comentarios

Solo una aclaración rápida. Es posible que no esté recreando su configuración exacta, pero una prueba manual rápida muestra que el encabezado Content-Type está configurado correctamente en application/json .

En cuanto a la respuesta vacía, me inclino a estar de acuerdo con @kltdwrds. No sé si la especificación permite un cuerpo vacío, sin embargo, tanto de JavaScript JSON.parse y Python de json.loads llegan a decodificar una cadena vacía.

Es decir, data=None debe codificarse como null .


Pensándolo bien, el comportamiento actual tiene sentido. Aunque JSON.parse y json.loads fallan, es responsabilidad del cliente verificar el tipo de contenido antes de analizarlo. En todo caso, se trata de un error en jQuery.

mmm estoy usando

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

No estoy seguro de dónde se establece el encabezado Content-Type , pero acabo de confirmar que falta en las respuestas usando el ejemplo anterior.

Parece que el encabezado Content-Type se elimina en una respuesta de renderizador vacía (línea 80)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Nuestro comportamiento actual para return Response() es intencional. Aunque devolver null también sería válido, es más común que necesitemos una forma de devolver una respuesta vacía sin tipo de contenido. Probablemente prefiero que dejemos las cosas como están por ahora.

¿Fue útil esta página
0 / 5 - 0 calificaciones