使用来自JQuery AJAX调用的Python CGI FieldStorage访问字段

时间:2013-05-13 16:55:06

标签: javascript python jquery cgi

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

2 个答案:

答案 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 ) )

产生我认为你想要的结果。