我正在尝试让Python、cgi模块、ajax/javascript组合工作。由于我的服务器访问方式(基本上是租用的网络空间),我无法安装像django或其他任何web框架之类的东西。现在我只能使用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”参数的删除。
现在这样做可以实现我想要的效果,但这种方式似乎不太合适。必须有一种方法可以使用经典方式来解决这个问题...
通常情况下,任何尝试或建议都是受欢迎的。我真的不知道还能尝试什么。谢谢大家。