我编写了一些JQuery,它对Python脚本进行了ajax调用。我已经成功地在它们之间来回传递字符串,但是我从CGI FieldStorage对象中获得了奇怪的行为,我用它来获取Python脚本中的输入。我还设法发送了一个带键/值对的简单对象,如下所示:
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"]
(我不确定它们为什么会被反转)。我还可以通过将{。1}}等内容替换为simple.py的最后一行来获取相应的值。
但是,当我尝试制作一个多级对象(对象中的一个对象)时,我会产生奇怪的行为。例如,我保留了我已创建的deptObj,然后将print json.dumps(fs["one"].value)
传递给ajax调用。然后,当我告诉simple.py打印出密钥时,结果为data: { departments: deptObj}
而不是我期望的结果["departments[two]", "departments[one]"]
。然后,由于“部门”显然不是关键,我在尝试["departments"]
时得到KeyError,而print json.dumps(fs["departments"].value)
给出结果为1。
根据documentation for FieldStorage,“通过表单[key]访问的字段本身就是FieldStorage的实例”,所以我认为我的FieldStorage对象将有一个“departments”键,其值是另一个FieldStorage对象包含键“一”和“两”。但是,这似乎不是真的。如何使用FieldStorage形成一个多级Javascript对象并在我的python脚本中访问它?
答案 0 :(得分:1)
这只是jQuery很傻。您应该在traditional: true
来电中设置$.ajax
。
答案 1 :(得分:0)
这不会严格回答你的问题,但我希望它能回答你的目标,而不是你问的具体细节。如果这不是你想要的,我很抱歉。
jQuery传递Ajax请求,其内容类型为(默认情况下)application/x-www-form-urlencoded; charset=UTF-8
(取自jQuery (v1.0 and later) documentation)。
有几种方法可以从JavaScript中将JSON放入python脚本中。第一个是显式创建一个表单字段并传入'stringified'JSON结构,然后您可以在另一端解析。另一个是尝试逆向工程jQuery如何编码JSON字符串并将编码字段分成JSON字符串(听起来很痛苦)。
(在我看来)有一种更好的方法,它通过在Ajax查询中将内容类型指定为JSON,立即将内容类型作为JSON传递。例如,将jQuery Ajax调用更改为:
deptObj = { one : '1', two : '2'};
$.ajax({
data: deptObj,
type: "POST",
url: "simple.py",
dataType : "json",
success: function(result) { console.log("Success!"); console.log(result); },
error: function(request, error) { console.log("Error"); console.log(request); }
});
(即将type
添加到'POST'
并将dataType
添加到'json'
)。以及相应的Python代码:
#!/usr/bin/env python
import json
import sys
import cgi
import cgitb
cgitb.enable() # display error messages in web browser
print "Content-type: application/json\n\n"
print json.dumps( json.load( sys.stdin ) )
产生我认为你想要的结果。