使用Python 3在Django POST请求中访问嵌套对象

2 投票
1 回答
1155 浏览
提问于 2025-04-18 00:22

我在通过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
        }
    })

如果你直接把一个普通的对象作为数据传递,它会被转换成查询字符串,无论你声明的内容类型是什么。

撰写回答