Django-rest-framework: `data = None`の場合、JSONRendererは有効なjson応答を返しません

作成日 2018年06月13日  ·  4コメント  ·  ソース: encode/django-rest-framework

再現する手順

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

予想される行動

null{}ような有効なjson応答本文

実際の動作

Content-Typeヘッダーが設定されておらず、空の応答が返されます-jqueryのajax()を使用してリクエストを行う場合は特に苦痛です。 parseerrorをスローし、本文が空の場合の成功応答の約束を拒否します。 こちらをご覧くださいhttps://stackoverflow.com/a/6186905

ここでのPR: https

最も参考になるコメント

空のレンダラー応答で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とPythonのjson.loads両方が空の文字列のデコードに失敗します。

つまり、 data=Nonenullとしてエンコードする必要があります。


考え直してみると、現在の動作は理にかなっています。 JSON.parsejson.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 評価