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

时间:2013-02-21 00:36:50

标签: javascript python ajax cgi

我正在尝试使用Python,cgi模块,ajax / javascript组合。由于我的服务器访问性质(基本上是租用的网站空间),我无法安装django或任何其他webframework之类的东西。我现在坚持使用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。)

我觉得我只是有点密集而且非常简单。非常感谢任何寻找我做错的帮助。非常感谢提前!

P.S。在我发布这里之前,我已经在一段时间内搜索了stackoverflow和web。有许多相关的主题,但没有什么(看似)简单,就像我问的那样。如果这个问题有答案重复,那么我道歉并感谢链接。再次感谢。

追溯是:

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 个答案:

答案 0 :(得分:3)

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连接。