web-dev-qa-db-ja.com

DjangoリクエストPostjson

ビューをテストしようとすると、IPadからjsonリクエストを受け取ります。形式は次のとおりです。

req = {"custom_decks": [
        {
            "deck_name": "deck_test",
            "updates_last_applied": "1406217357",
            "created_date": 1406217380,
            "slide_section_ids": [
                1
            ],
            "deck_id": 1
        }
          ],
    "custom_decks_to_delete": []
}

これをjsonlintで確認したところ、合格しました。

私は次の方法でリクエストを投稿します:

response = self.client.post('/library/api/6.0/user/'+ uuid +
'/store_custom_dec/',content_type='application/json', data=req) 

ビューは「creation_success」を返します:false

問題は、ビューのpostメソッドがキーcustom_decksを見つけられないことです。

QueryDict: {u'{"custom_decks": [{"deck_id": 1, "slide_section_ids": [1], 
"created_date":1406217380, "deck_name": "deck_test"}], 
"custom_decks_to_delete": []}': [u'']}>

問題は、ビューのpostメソッドがキーcustom_decksを見つけられないことです。それは私のdictを1つのキーでQueryDictに変換しているからです。

私はすべての助けに感謝します。

ありがとう

14
user3877330

あなたはJSONを投稿していますが、これはフォームでエンコードされたデータと同じではありません。 request.bodyの値を取得し、それを逆シリアル化する必要があります。

data = json.loads(request.body)
custom_decks = data['custom_decks']
19
Daniel Roseman

他の回答のコードを使用してHttpRequestからJSONデータを直接取得する際に問題が発生したため:

data = json.loads(request.body)
custom_decks = data['custom_decks']

エラー:

the JSON object must be str, not 'bytes'

これはPythonバージョン> 3:

json_str=((request.body).decode('utf-8'))
json_obj=json.loads(json_str)

に言及されているように、decode( 'utf-8')に関して:

RFC 4627:

「JSONテキストはUnicodeでエンコードされます。デフォルトのエンコードはUTF-8です。」

バージョン> 3のこの特定の問題を参照するPythonリンクを添付しました。

http://bugs.python.org/issue10976

7
chuseuiti

_python 3.6_および_Django 2.0_:

_post_json = json.loads(request.body)
custom_decks = post_json.get("custom_decks")
_

json.loads(s, *, encoding=None,...)

バージョン_3.6_で変更:sはタイプbytesまたはbytearrayになりました。入力エンコーディングは、_UTF-8_、_UTF-16_、または_UTF-32_である必要があります。

_python 3.6_NO needrequest.body.decode('utf-8')から。

2
lvii

HttpRequestにはread()メソッドがあります リクエストからJSONをロードするのは、実際には次のように簡単です。

def post(self, request, *args, **kwargs):
    import json
    data = json.load(request)
    return JsonResponse(data=data)

これをビューとして表示すると、テストでき、返送されたJSONがエコーされます。

2
Melvyn