Django-rest-framework: JSONRenderer ne renvoie pas de réponse json valide lorsque `data=None`

Créé le 13 juin 2018  ·  4Commentaires  ·  Source: encode/django-rest-framework

Étapes à reproduire

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

Comportement attendu

Un corps de réponse json valide comme null ou {}

Comportement réel

Aucun en-tête Content-Type n'est défini et une réponse vide est renvoyée - particulièrement pénible lors des requêtes avec le ajax() jquery. Il renvoie une erreur d'analyse et rejette la promesse d'une réponse de succès avec un corps vide. Voir ici https://stackoverflow.com/a/6186905

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

Commentaire le plus utile

Il semble que l'en-tête Content-Type soit supprimé sur une réponse de rendu vide (ligne 80)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Tous les 4 commentaires

Juste une clarification rapide. Je ne suis peut-être pas en train de recréer votre configuration exacte, mais un test manuel rapide montre que l'en-tête Content-Type est correctement défini sur application/json .

En ce qui concerne la réponse vide, je suis enclin à être d'accord avec @kltdwrds. Je ne sais pas si la spécification permet à un corps vide, cependant, à la fois JavaScript de JSON.parse et Python json.loads ne parviennent pas à décoder une chaîne vide.

C'est-à-dire que data=None doit être encodé sous la forme null .


À la réflexion, le comportement actuel est logique. Bien que JSON.parse et json.loads échouent, il est de la responsabilité du client de vérifier le type de contenu avant l'analyse. Si quoi que ce soit, c'est un bogue dans jQuery.

hum j'utilise

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

Je ne sais pas où l'en-tête Content-Type est défini, mais je viens de confirmer qu'il est absent des réponses à l'aide de l'exemple ci-dessus.

Il semble que l'en-tête Content-Type soit supprimé sur une réponse de rendu vide (ligne 80)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Notre comportement actuel pour return Response() est intentionnel. Bien que le renvoi de null soit également valide, il est plus courant que nous ayons besoin d'un moyen de renvoyer une réponse vide sans type de contenu. Je préférerais probablement que nous laissions les choses telles qu'elles sont pour le moment.

Cette page vous a été utile?
0 / 5 - 0 notes