ビューをテストしようとすると、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に変換しているからです。
私はすべての助けに感謝します。
ありがとう
あなたはJSONを投稿していますが、これはフォームでエンコードされたデータと同じではありません。 request.body
の値を取得し、それを逆シリアル化する必要があります。
data = json.loads(request.body)
custom_decks = data['custom_decks']
他の回答のコードを使用して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リンクを添付しました。
_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')
から。
HttpRequestにはread()メソッドがあります リクエストからJSONをロードするのは、実際には次のように簡単です。
def post(self, request, *args, **kwargs):
import json
data = json.load(request)
return JsonResponse(data=data)
これをビューとして表示すると、テストでき、返送されたJSONがエコーされます。