0

我编写了一些对 Python 脚本进行 ajax 调用的 JQuery。我已经成功地在它们之间来回传递字符串,但是我从用于获取 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"](我不确定它们为什么被反转)。我还可以通过将 simple.py 的最后一行替换为print json.dumps(fs["one"].value).

但是,当我尝试制作多级对象(对象中的对象)时,我会遇到奇怪的行为。例如,我保留了我已经创建的 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。

根据FieldStorage 的文档,“通过 form[key] 访问的字段本身就是 FieldStorage 的实例”,所以我认为我的 FieldStorage 对象将有一个“部门”键,其值是另一个包含键“one”的 FieldStorage 对象”和“二”。然而,这似乎不是真的。如何形成多级 Javascript 对象并使用 FieldStorage 在我的 python 脚本中访问它?

4

2 回答 2

1

这只是 jQuery 很愚蠢。你应该traditional: true在你的$.ajax电话中设置。

于 2013-05-13T17:15:26.700 回答
0

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

jQuery 传递内容类型为(默认情况下)的 Ajax 请求application/x-www-form-urlencoded; charset=UTF-8(取自jQuery(v1.0 及更高版本)文档)。

有几种方法可以将 JSON 从 JavaScript 获取到您的 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); }
});

(即添加typeto'POST'和添加dataTypeto '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 ) )

产生我认为是您想要的结果。

于 2014-09-03T02:01:55.803 回答