我尝试测试视图,我收到来自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。
我感谢所有的帮助。
由于
答案 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链接。
答案 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.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
无需 request.body.decode('utf-8')
。