Django请求发布json

use*_*330 14 django post json httprequest django-views

我尝试测试一个视图,我收到来自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": []
}
Run Code Online (Sandbox Code Playgroud)

我在jsonlint中检查了它并且它通过了.

我通过以下方式发布请求:

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

视图返回"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'']}>
Run Code Online (Sandbox Code Playgroud)

问题是视图中的post方法找不到关键字custom_decks.因为它用一个键将我的dict转换为QueryDict.

我感谢所有的帮助.

谢谢

Dan*_*man 17

您正在发布JSON,这与表单编码数据不同.您需要获取它的值request.body并将其反序列化:

data = json.loads(request.body)
custom_decks = data['custom_decks']
Run Code Online (Sandbox Code Playgroud)


chu*_*iti 7

因为我在使用其他答案的代码直接从HttpRequest获取JSON数据时出现问题:

data = json.loads(request.body)
custom_decks = data['custom_decks']
Run Code Online (Sandbox Code Playgroud)

错误:

the JSON object must be str, not 'bytes'
Run Code Online (Sandbox Code Playgroud)

以下是Python版本> 3的另一个答案的更新:

json_str=((request.body).decode('utf-8'))
json_obj=json.loads(json_str)
Run Code Online (Sandbox Code Playgroud)

关于解码('utf-8'),如:

RFC 4627:

"JSON文本应以Unicode编码.默认编码为UTF-8."

我为版本> 3附加了这个特定问题的Python链接.

http://bugs.python.org/issue10976