Django请求发布json

时间:2014-07-25 15:00:09

标签: json django post django-views httprequest

我尝试测试视图,我收到来自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转换为QueryDict。

我感谢所有的帮助。

由于

4 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:7)

因为我在使用其他答案的代码直接从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)

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

中所述

RFC 4627:

  

“JSON文本应以Unicode编码。默认编码为   UTF-8“。

我为版本> 3附加了针对此特定问题的Python链接。

http://bugs.python.org/issue10976

答案 2 :(得分:2)

由于HttpRequest has a read() method从请求加载JSON实际上非常简单:

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

如果你把它作为一个视图,你可以测试它,它会回显你发回给你的任何JSON。

答案 3 :(得分:2)

python 3.6django 2.0

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

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

  

版本3.6已更改:s现在可以是bytesbytearray类型。输入编码应为UTF-8UTF-16UTF-32

来自python 3.6 无需 request.body.decode('utf-8')