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)
因为我在使用其他答案的代码直接从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
| 归档时间: |
|
| 查看次数: |
16272 次 |
| 最近记录: |