2013-05-13 16 views
0

我写了一些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脚本中访问它?

回答

1

这只是jQuery的愚蠢。您应该在$.ajax呼叫中设置traditional: true

+0

这似乎已经部分解决了问题 - 现在'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

+0

我也试过'fs [“departments”] .keys()',它给了我错误“MiniFieldStorage实例没有属性'键'”。 – FrancesKR 2013-05-14 17:08:21

+0

您只需将自己倾倒回json并使用浏览器控制台即可令您感到困惑。在你的Python脚本中放置一个断点并在那里检查它。 – 2013-05-14 20:48:52

0

这不会严格回答你的问题,但我希望它回答了目标,而不是你问的具体问题。如果不是你想要的,我很抱歉。

jQuery传递内容类型为(默认)application/x-www-form-urlencoded; charset=UTF-8(取自jQuery (v1.0 and later) documentation)的Ajax请求。

有几种方法可以从JavaScript中将JSON引入到Python脚本中。首先是明确地创建一个表单字段并传递'字符串化'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)) 

产生我相信是你想要的结果。