Python/CGI/Ajax:cgi.FieldStorage未接收参数
我正在尝试让Python、cgi模块和ajax/javascript结合起来工作。由于我的服务器访问限制(基本上是租用的网络空间),我无法安装像django这样的框架或其他任何网络框架。目前我只能使用cgi。我可以调用Python文件来简单地打印一些东西,但一旦涉及到向Python文件传递参数时,cgi.FieldStorage()却没有接收到任何输入。当我为FieldStorage添加打印语句时,输出如下:
FieldStorage(None, None, [])
下面是我所有必要的代码。基本上,我只是想做一个测试,从文本输入中获取一个字符串,在它后面加上“1”,然后返回这个字符串。
有趣的是,当我使用一个简单的php文件来做完全相同的事情,并在其他完全相同的脚本中使用它时,脚本没有任何问题。这里是我尝试的一个典型php脚本:
<?php
$user = urldecode(implode(file('php://input')));
$adj_user = $user . "1";
echo $adj_user;
?>
(请注意,我想使用Python,因为我对它更熟悉,而我对php不太喜欢。)
我感觉我可能有点笨,这其实是个很简单的事情。任何帮助我找出我做错了什么的建议都非常感谢。提前谢谢你们!
附言:在我发帖之前,我在stackoverflow和网上搜索了很久。有很多相关的话题,但没有一个看起来像我问的这么简单。如果这个问题有重复的答案,我很抱歉,并会感激你提供一个链接。再次感谢。
错误追踪信息是:
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'参数。
现在这确实做到了我想要的效果,但它不应该是这样的。一定有办法让它以传统的方式工作...
像往常一样,任何尝试或建议都欢迎。我真的不知道还可以尝试什么。谢谢大家。
1 个回答
数据格式是 application/x-www-form-urlencoded
,它的样子是这样的:
key=value&key2=value2
… 在这里,键和值都是经过网址编码的。
你只是发送了一个字段的值,没有键。
var postData = encodeURIComponent('user') + '=' + encodeURIComponent(user);
xhr.send(postData);
你之前的 PHP 代码能正常工作,是因为你在读取原始的 POST 数据,而不是 $_POST['user']
(这在 Python 中是相当于的)。
你还需要访问 form['user'].value
,而不是 form['user']
。这样才能返回一个 str
类型的值,所以如果想要和 + 1
连接在一起,你需要先转换一下类型。