我写了一些JQuery调用一个Python脚本的ajax调用。我已经成功地在它们之间来回传递字符串,但是我从CGI FieldStorage对象中获取了奇怪的行为,我使用它来获取Python脚本中的输入。我也设法送一个简单的对象与键/值对,是这样的:从JQuery AJAX调用访问字段与Python CGI FieldStorage
deptObj = { one : '1', two : '2'};
$.ajax({
data: deptObj,
url: "simple.py",
success: function(result) { console.log("Success!"); console.log(result); },
error: function(request, error) { console.log("Error"); console.log(request); }
});
这里是我的Python脚本,simple.py:
#!/usr/bin/env python
import json
import cgi
import cgitb
print "Content-type: application/json\n\n"
cgitb.enable() # display error messages in web browser
fs = cgi.FieldStorage()
print json.dumps(fs.keys())
当我运行的JavaScript,它正确地打印出我的对象中的按键,即["two", "one"]
(我不确定它们为什么被颠倒)。我也可以通过用类似print json.dumps(fs["one"].value)
的东西替换simple.py的最后一行来获得相应的值。但是,当我尝试创建一个多级对象(对象内的一个对象)时,我得到了奇怪的行为。例如,我保留了我已经创建的deptObj,然后通过data: { departments: deptObj}
传递给ajax调用。然后,当我告诉simple.py打印出键时,结果是["departments[two]", "departments[one]"]
而不是我所期望的,["departments"]
。而且,由于“部门”显然不是关键,我得到一个KeyError异常,当我尝试print json.dumps(fs["departments"].value)
,而print json.dumps(fs["departments[one]"].value)
给我的1
结果按照documentation for FieldStorage“的领域,通过形式访问[关键]本身就是FieldStorage的实例“,所以我认为我的FieldStorage对象会有一个”部门“键,其值是另一个包含键”one“和”two“的FieldStorage对象。但是,这似乎并不正确。如何构建多级Javascript对象并使用FieldStorage在我的python脚本中访问它?
这似乎已经部分解决了问题 - 现在'fs.keys()'给了我“部门”,但我仍然无法弄清楚如何访问“一个”和“两个”。 'FS [ “部门”。值“在我的Web Inspector控制台中显示为[object object],没有任何字段。 'fs.getlist(“departments”)'给了我类似的东西''[[object Object]“]''。 'len(fs [“departments”])'给了我一个错误,说“AttributeError:MiniFieldStorage实例没有'len'属性。有任何想法吗? – FrancesKR 2013-05-13 23:30:26
我也试过'fs [“departments”] .keys()',它给了我错误“MiniFieldStorage实例没有属性'键'”。 – FrancesKR 2013-05-14 17:08:21
您只需将自己倾倒回json并使用浏览器控制台即可令您感到困惑。在你的Python脚本中放置一个断点并在那里检查它。 – 2013-05-14 20:48:52