6

私は次の見解を持っています:

class Authenticate(generics.CreateAPIView):
    serializer_class = AuthSerializer

    def create(self, request):
        serializer = AuthSerializer(request.POST)
        # Do work here

これは、データがフォームとして渡される場合はうまく機能しますが、データが生の JSON として渡される場合、シリアライザーはすべてのフィールドが None に設定された状態でインスタンス化されます。ドキュメントには、生の JSON 引数の処理に固有のものがあるはずであると記載されています。

どんな助けでも大歓迎です。

アップデート

生の JSON を渡すときに Browsable API を期待どおりに動作させるために、次の回避策がありますが、もっと良い方法があるはずです。

def parse_data(request):
    # If this key exists, it means that a raw JSON was passed via the Browsable API
    if '_content' in request.POST:
        stream = StringIO(request.POST['_content'])
        return JSONParser().parse(stream)
    return request.POST


class Authenticate(generics.CreateAPIView):
    serializer_class = AuthSerializer

    def create(self, request):
        serializer = AuthSerializer(parse_data(request))
        # Do work here
4

2 に答える 2

11

リクエスト データに間違った方法でアクセスしていrequest.POSTます。フォームのマルチパート データの解析のみを処理します。

request.data代わりにREST フレームワークを使用してください。これは、フォーム データ、json データ、または構成したその他のパーサーのいずれかを処理します。

于 2013-07-25T07:58:23.943 に答える
1

Browsable API を使用している場合は、そのようになっていると思います。

Browsable API を使用して JSON リクエストをテストするべきではないと思います。curl代わりに次を使用してください。

curl -v -H "Content-type: application/json" -X POST -d '{"foo": 1, "bar": 1}' http://127.0.0.1:8000/api/something/

それが役に立てば幸い。

于 2013-07-24T21:27:37.227 に答える