var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", "http://192.67.64.41/cgi-bin/hi.py?array=" + myArray, false );
xmlHttp.send( null );

然后在Python中我得到了这样的结果

import cgi
form = cgi.FieldStorage()
array = form.getvalue("array")

But it doesn't come out right, in python then if I were to do

print array[0]
#I get -> "o"
print array[1]
#I get -> "n"
print array[2]
#I get -> "e"

等,但如果我所要的是

print array[0]
#output -> ["one", "two"]

我怎样才能实现这个目标?

5 个评论
你能改变你在python中接收数据的方式吗?最好是改变你的请求,从正文中读取数据。
@MarkoGrešak 是的,我可以改变它,我只是不确定要改成什么? 但如果你能告诉我一个更好的方法,从javascript向pythonn发送数据,那就太好了。
这个答案可以作为一个开始,你发送一个POST请求,把你的数据作为javascript请求体。如果你使用一个库,如jQuery在这里,使用$.ajax,XMLHttpRequests是一件轻而易举的事。对于后端框架,请选择以下之一网络框架列在Python网页上。在任何严肃的工作中,你都需要这些来提高生产力。
@MarkoGrešak 是的,好的,但我还是要如何传递一个二维数组呢?
你可能需要在发送前用JSON.stringify把它变成json,然后在你的python代码中把它解析回来。但我相信jQuery的$.ajax({url: 'http://192.67.64.41/cgi-bin/hi.py', data: myArray })会自动做到这一点。
javascript
python
arrays
http
get
spen123
spen123
发布于 2015-08-11
2 个回答
Cjmarkham
Cjmarkham
发布于 2015-08-11
已采纳
0 人赞同

你不能简单地传递一个数组作为查询参数。你需要对数组进行迭代,并将其添加到URL字符串中,如?array[]=one&array[]=two

const a = ['one', 'two']
let url = 'www.google.com'
for (let i = 0; i < a.length; i++) {
    // Check to see if the URL has a query string already
    if (url.indexOf('?') === -1) {
        url = `${url}?array[]=${a[i]}`
    } else {
        url = `${url}&array[]=${a[i]}`
console.log(url)
所以我必须分别传递每个字符串?也像?array[]=one&array[]=two&array[]=foo&array[]=bar?但这样一来,在python中就会变成一个数组了?
你将能够通过他们的键来访问GET值,所以array[0]将等于one
好吧,为了澄清,array[2]会是foo吗?有什么办法让它成为一个二维数组吗?
你可以通过简单地构建查询字符串来做到这一点,因此查询字符串将读作array[][]=bar。这将返回为array[0][0]
@carl-markham :你是否记得查询字符串不是无限的?你的建议会起作用,但是,嗯,我宁愿正面解决这个问题,而不是削弱数组的作用。
Dalen
Dalen
发布于 2015-08-11
0 人赞同

不,你不需要这样做。而且,是的,你可以这样做!你可以像你那样把它作为一个字符串传递,然后在Python中得到它并评估它。

你可以使用。

evaldict = {}
array = eval("[[1, 2, 3], [4, 5, 6]]", evaldict)

虽然我强制将评估的范围封装在一个dict中,但这并不安全!"。

因为有人可以传递一些其他的 Python 表达式来进行评估。因此最好使用 ast 模块中的 literal_eval() ,它不评估表达式。

我建议你使用jquery和它的post()方法来做这个,使用POST HTTP方法而不是GET。

另外,这可以很好地、安全地使用json完成(发送json,而不是仅仅手动串联JS数组。 并使用它来避免直接评估一个列表(在Python中)。

Here is the client side using jquery:

<html><head><title>TEST</title>
<script type="text/javascript" src="jquery.js"></script>
<script>
pyurl = "http://example.com/cgi-bin/so.py";
function callpy (argdict) {
    $.post(pyurl, argdict, function (data) {    
    // Here comes whatever you'll do with the Python's output.
    // For example:
    document.getElementById("blah").innerHTML = data;
    }, "text");
var myArray = [["one", "two"], ["foo", "bar"]];
// This is array shape dependent:
function stringify (a) {
    return "['" + a.join("', '") + "']";
myArrayStr = "[";
for (x = 0; x<myArray.length; x++) {
    myArrayStr += stringify(myArray[x]) +", ";
myArrayStr += "]";
// This would be better, but it is library dependent:
//myArrayStr = JSON.stringify(myArray);
</script>
</head><body>
<a href="#" onclick="javascript:callpy({'array': myArrayStr});">Click me!</a>
<p id="blah">
Something will appear here!
</body></html>

而这是服务器端的CGI。

#! /usr/bin/env python
    # This version of eval() ensures only datatypes are evaluated
    # and no expressions. Safe version of eval() although slower. It is available in Python 2.6 and later
    from ast import literal_eval as eval
except ImportError:
    import sys
    print "Content-Type: text/html\n"
    print "<h1>literal_eval() not available!</h1>"
    sys.exit()
import cgi, cgitb
import sys
cgitb.enable()
print "Content-Type: text/html\n"
i = cgi.FieldStorage()
q = i["array"].value.strip()
print "I received:<br>"
print q
# Put here something to eliminate eventual malicious code from q
# Check whether we received a list:
if not q.startswith("[") and not q.endswith("]"):
    print "Wrong query!"
    sys.exit()
try: myArray = eval(q)
except: print "Wrong query!"; sys.exit()
if not isinstance(myArray, list):
    print "Wrong query!"
    sys.exit()