Django-rest-framework: JSONRenderer gibt keine gültige Json-Antwort zurück, wenn `data=None`

Erstellt am 13. Juni 2018  ·  4Kommentare  ·  Quelle: encode/django-rest-framework

Schritte zum Reproduzieren

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

Erwartetes Verhalten

Ein gültiger Json-Antworttext wie null oder {}

Tatsächliches Verhalten

Kein Content-Type Header gesetzt und eine leere Antwort wird zurückgegeben - besonders schmerzhaft, wenn Anfragen mit ajax() jquery gestellt werden. Es wirft einen Parserfehler und weist das Versprechen auf eine Erfolgsantwort mit einem leeren Körper zurück. Siehe hier https://stackoverflow.com/a/6186905

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

Hilfreichster Kommentar

Es sieht so aus, als ob der Content-Type Header in einer leeren Renderer-Antwort gelöscht wird (Zeile 80).
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Alle 4 Kommentare

Nur eine kurze Klarstellung.. Ich kann Ihr genaues Setup möglicherweise nicht neu erstellen, aber ein kurzer, manueller Test zeigt, dass der Header Content-Type korrekt auf application/json .

Was die leere Antwort angeht, bin ich geneigt, @kltdwrds zuzustimmen. Ich weiß nicht, ob die Spezifikation einen leeren Körper zulässt, aber sowohl JavaScripts JSON.parse als auch json.loads Python können keine leere Zeichenfolge decodieren.

Das heißt, data=None sollte als null codiert werden.


Auf den zweiten Blick macht das aktuelle Verhalten Sinn. Obwohl JSON.parse und json.loads fehlschlagen, liegt es in der Verantwortung des Clients, den Inhaltstyp vor dem Parsen zu überprüfen. Wenn überhaupt, ist dies ein Fehler in jQuery.

hm ich benutze

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

Ich bin mir nicht sicher, wo der Header Content-Type gesetzt wird, aber ich habe gerade bestätigt, dass er in den Antworten fehlt, indem ich das obige Beispiel verwendet habe.

Es sieht so aus, als ob der Content-Type Header in einer leeren Renderer-Antwort gelöscht wird (Zeile 80).
https://github.com/encode/django-rest-framework/blob/master/rest_framework/response.py#L72

Unser derzeitiges Verhalten für return Response() ist beabsichtigt. Obwohl auch die Rückgabe von null gültig wäre, ist es üblicher, dass wir eine Möglichkeit benötigen, eine leere Antwort ohne Inhaltstyp zurückzugeben. Ich würde es wahrscheinlich lieber lassen, wenn wir die Dinge vorerst so lassen, wie sie sind.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen