2013-07-24 1 views
5

私は、次のビューがあります。Djangoの残りFrameworkは、生のJSONとして渡されたデータをデシリアライズしない

class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

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

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

ご協力いただければ幸いです。

UPDATE

私は予想通り、生のJSONを渡すときにブラウズ可能な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 
+0

エラーは何ですか?または、実際にエラーが発生しましたか? –

+0

シリアライザはNonesで初期化されます。問題は、Browsable APIがJSONを '_content'キーの中に送信することです。私はこれがいつの時であるかを特定し、jsonをdictに構文解析する関数を作成しましたが、より良い方法が必要であると確信しています。 – Raphael

答えて

8

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

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

+0

フレームワークの作成者からの回答のようなものはありません。 – Raphael

1

私はそれがBrowsable APIを使用しているときの方法だと思います。

私の代わりにcurlを使用し、あなたはJSONリクエストをテストするためにブラウズ可能なAPIを使用してはならないと思う:

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

はそれがお役に立てば幸いです。

+0

他の開発者は、JSONを検証するためにBrowsable APIを使用することを期待しています。ブラウズ可能APIにはraw JSONをポストするタブがあります。私はプロジェクトのGithubページに問題を掲載しました。シリアライザの__init__の簡単なチェックは、そのトリックを行い、それをボックスの外で動作させる必要があります。 – Raphael

+0

いいえ、私に結果を知らせてください;) –

関連する問題