在我的项目中,我有javascript迭代一组单选按钮。首先,它检查名称集中所选按钮是否已更改,如果已经更改,则会记录该行新选择的按钮的值,并将其附加到变量dataString
,然后再继续下一个按钮组。这一切都很好,它可以完美地收集所有数据。但是,当我尝试通过AJAX发送数据时,我遇到了问题。
对于每个更改的行,我会附加一个rowName
变量和一个deviceName
变量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, [])
现在由于AJAX调用中data:
属性的格式为{keyname: value, etc}
,是否可以以该格式在预制列表中发送数据,或者我是否需要更改方式格式化dataString
并以其他方式发送它?
答案 0 :(得分:0)
我最终以两种方式达到了预期的效果。
第一种方法:回想一下在实施JQuery之前我是如何执行AJAX请求的,我将dataString
格式化为
rowName=firstRowName&deviceName=firstDeviceName&rowName=secondRowName&deviceName=secondDeviceName
等等。然后我只是在AJAX调用中将它附加到我的url,所以它看起来像:
url:"http://localhost/cgi-bin/saveState.py"+dataString
第二种方法:我让它工作的另一种方式是以与第一种方法相同的方式格式化dataString
,但之后只需将其用作我的{{1属性。
data
我发现这很有用,因为它根本不遵循data: dataString
调用的通常格式。但唉,确实有效。
答案 1 :(得分:0)
在初始尝试中,您将以JSON格式将POST数据发送到Ajax方法。但是,FieldStorage期望它采用表单格式(application / x-www-form-urlencoded)。您在答案中提到的两种方法将它以表单格式提供给Ajax方法。
除了您的解决方案,另一种方法是使用JSON解析库而不是FieldStorage。具体如何做到这取决于您使用的框架 - 是Django,Pyramid等吗?