2

在我的项目中,我有 javascript 遍历一组单选按钮。首先,它检查名称集中的选定按钮是否已更改,如果已更改,则记录该行新选定按钮的值,将其附加到变量dataString中,然后再转到下一个按钮集。这一切都很好,它完美地收集了所有数据。但是,当我尝试通过 AJAX 发送该数据时遇到了问题。

对于更改的每一行,我附加一个rowName变量和一个deviceName变量 do dataString。理想情况下,我想发送这些,这样当我将数据发送到 Python 时,我最终会得到一个rowName列表和一个deviceName列表,就像发送多个同名变量时一样。

我的 AJAX 调用如下:

var call= $.ajax({
    type: "POST",
    url: "http://localhost/cgi-bin/savestate.py",
    data: dataString
}).done(function() {
    document.getElementById("upper").innerHTML+=(call.responseText);
});

正如我所说,我需要发送的数据收集得足够好。现在,dataString已格式化,如下所示:

"{rowName: 'firstRowName', deviceName: 'firstDeviceName', rowName: 'secondRowName', deviceName: 'secondDeviceName'}"

我还尝试更改 AJAX 调用,使data:调用看起来像:

data: {dataString}

并格式化dataString为:

"rowName: 'firstRowName', deviceName: 'firstDeviceName', rowName: 'secondRowName', deviceName: 'secondDeviceName'"

无论哪种方式我尝试发送它,数据都不会到达 python 脚本。当我从 Python 返回数据时,它显示为

FieldStorage(None, None, [])

现在,由于data:AJAX 调用中属性的格式是{keyname: value, etc},是否可以以该格式在预制列表中发送数据,或者我是否必须更改格式化方式dataString并以其他方式发送?

4

2 回答 2

0

我最终以两种方式达到了预期的效果。

第一种方法:回想一下在实现 JQuery 之前我是如何执行 AJAX 请求的,我将其格式化dataString

rowName=firstRowName&deviceName=firstDeviceName&rowName=secondRowName&deviceName=secondDeviceName

等等。然后我只是在 AJAX 调用中将其附加到我的 url 中,使其看起来像:

url:"http://localhost/cgi-bin/saveState.py"+dataString

第二种方法:我让它工作的另一种方法是格式化与dataString第一种方法相同的方式,但然后简单地将其用作我的data属性。

data: dataString

我发现这很奇怪,因为它根本不遵循通常的data:通话格式。但很可惜,它确实奏效了。

于 2013-06-25T13:13:54.653 回答
0

在您最初的尝试中,您将 POST 数据以 JSON 格式发送到您的 Ajax 方法。但是,FieldStorage 期望它采用表单格式(application/x-www-form-urlencoded)。您在答案中提到的两种方法以表单格式将其提供给 Ajax 方法。

除了您的解决方案之外,另一种方法是使用 JSON 解析库而不是 FieldStorage。具体如何执行取决于您使用的框架 - 是 Django、Pyramid 等吗?

于 2013-06-25T13:20:14.000 回答