我正在尝试让Python、cgi模块、ajax/javascript组合工作。由于服务器访问的本质(基本上是租用的Due空间),我无法安装像django或任何其他Due框架之类的东西。我现在被cgi困住了。我可以调用python文件来简单地打印一些内容,但是一旦将一个参数传递给python文件,cgi.FieldStorage()就不会接收任何输入。当我为FieldStorage添加一个print语句时,输出如下:
FieldStorage(None, None, [])您可以在下面找到所有必要的代码。本质上,我所做的(为了测试目的)就是从文本输入中获取一个字符串,在它的末尾添加一个"1“并返回它。
有趣的是,当我使用一个简单的php文件执行完全相同的操作,并在相同的脚本中使用它时,脚本工作时不会出现任何问题。下面是我尝试过的一个典型的php脚本:
<?php
$user = urldecode(implode(file('php://input')));
$adj_user = $user . "1";
echo $adj_user;
?>(请注意,我想使用python,因为我对它更满意,我非常不喜欢php。)
我有一种感觉,我只是有点浓重,这是非常简单的事情。任何帮助我发现我做错了什么都是非常感谢的。提前谢谢!
在我发表文章之前很长一段时间,我已经浏览了堆栈溢出和网页。有很多相关的话题,但没有什么比我要求的更简单了。如果这个问题有一个答案的重复,那么我道歉,并将感谢一个链接。再次感谢。
追踪结果是:
Traceback (most recent call last):
File "/home/www/xxxxx/html/cgi-bin/hello.py", line 14, in <module>
adj_user = form['user'] + "1"
File "/usr/lib/python2.5/cgi.py", line 567, in __getitem__
raise KeyError, key
KeyError: 'user'这是"index.html“
<!DOCTYPE html>
<html>
<head>
<title>Report</title>
<script type='text/javascript' src='test.js'></script>
</head>
<body>
<form method="post" action="">
<p>Please enter your name here:
<input type="text" name="user">
<input type="submit" name="submit" value="Submit" onClick="return hello(this.form.user.value);">
</p>
</form>
</body>
</html>这是"test.js“文件:
function hello(user) {
// Mozilla version
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
}
// IE version
else if (window.ActiveXObject) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
//user=encodeURIComponent(user);
xhr.open("POST", "../cgi-bin/hello.py");
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
xhr.send(user);
xhr.onreadystatechange=function() {
if (xhr.readyState===4) {
adj_user = xhr.responseText;
alert ("Hello " + adj_user);
}
}
return false;
}最后,我的服务器的cgi-bin中的"hello.py“
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import cgi
form = cgi.FieldStorage()
# enable debugging
import cgitb
cgitb.enable()
print "Content-Type: text/html;charset=utf-8"
print
adj_user = form['user'] + "1"
print adj_user编辑
我取得了一些进步,但这仍不是我所希望的。我将以下块更改如下:
xhr.open("GET", "../cgi-bin/hello.py?user=" + user, true);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
xhr.send();请注意从POST到GET的更改和后缀‘?user=’+ user ',以及在send()方法中删除'user‘参数。
这就是我想要的,但它不应该是那样的。一定有办法让这个用古典的方式..。
如往常一样,欢迎任何企图或建议。我真的不知道还能尝试什么。谢谢伙计们。
发布于 2013-02-23 11:46:27
application/x-www-form-urlencoded数据的格式是:
key=value&key2=value2…其中键和值是URL编码的。
您只是张贴一个字段的值,没有键。
var postData = encodeURIComponent('user') + '=' + encodeURIComponent(user);
xhr.send(postData);PHP代码工作的原因是因为您读取的是原始的POST数据,而不是$_POST['user'] (这就是您的Python所对应的)。
您还需要访问form['user'].value而不是form['user']。这将返回一个str,因此如果不执行类型转换,就不能将它与+ 1连接起来。
https://stackoverflow.com/questions/14992640
复制相似问题