使用Python 3在Django POST请求中访问嵌套对象
我在通过ajax的post请求访问嵌套对象时遇到了一些问题。下面是我的js代码:
$.ajax({
url: "/api/locate/",
type: "POST",
data: {start:
{
latitude: position.coords.latitude,
longitude: position.coords.longitude
}
},
dataType: 'json',
contentType: "application/x-www-form-urlencoded",
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
console.log(start);
},
success: function(data) {
console.log(data);
}
})
在我的视图中,我只能通过以下方式来获取数据:
latitude = request.POST['start[latitude]']
longitude = request.POST['start[longitude]']
这样做其实不太好,因为我希望能直接把start作为一个字典,里面包含纬度和经度的键。我知道这种格式是因为内容类型设置为“application/x-www-form-urlencoded”,但是当我把它改成“application/json”时,就需要从request.body中解码数据:
decoded = request.body.decode('utf8')
data = json.loads(decoded)
这又引发了一个ValueError错误:
期望值:第1行第1列(字符0)
解码后的字符串是:
start%5B0%5D%5Blatitude%5D=31.736784000000004&start%5B0%5D%5Blongitude%5D=-106.473027
你们有没有成功加载嵌套对象的经验,还是我只能用第一种方法呢?
补充说明:我使用的是Django 1.6.2和python 3.4
1 个回答
1
当你发送json数据时,要对你的对象使用JSON字符串化工具。
data: JSON.stringify({start:
{
latitude: position.coords.latitude,
longitude: position.coords.longitude
}
})
如果你直接把一个普通的对象作为数据传递,它会被转换成查询字符串,无论你声明的内容类型是什么。