Python/CGI/Ajax:cgi.FieldStorage未接收参数

3 投票
1 回答
3031 浏览
提问于 2025-04-17 16:34

我正在尝试让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 &lt;module&gt;
    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 个回答

3

数据格式是 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 连接在一起,你需要先转换一下类型。

撰写回答