【问题标题】:Python/CGI/Ajax: cgi.FieldStorage does not receive argumentsPython/CGI/Ajax:cgi.FieldStorage 不接收参数
【发布时间】:2013-02-06 05:01:12
【问题描述】:

我正在尝试让 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' 参数。

现在这确实是我想要的,但它不应该“是”那样。一定有办法让它以经典的方式工作......

像往常一样,欢迎任何尝试或建议。我真的不知道还能尝试什么。谢谢各位。

【问题讨论】:

    标签: javascript python ajax cgi


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的回答!不幸的是,我不太明白你的意思,我不能让我的代码与你写的东西一起工作。 (我只是用 'postData' 变量减去未关闭的 ' 等交换了代码中的行。)您能否为我写出有问题的代码块。我对 ajax 还很陌生,所以请多多包涵。谢谢!
    • 在 JavaScript 端,只需将 send 行替换为上面的两行即可。我也发现了 Python 方面的问题,并更新了答案。
    • 谢谢,伙计。做到了。它仍然不像我希望的那样充满活力。我仍然需要为每个传递的变量写一个“encodeURIComponent('key') + '=' + encodeURIComponent(key)”代码块,如果你有 3 个或更多,它可能会变得很长,但我会将你的答案标记为公认。谢谢朋友,你是明星!我会尽可能(显然是 22 小时)将 +50 奖励给你,当然,除非有人想出一种动态的方式来输入密钥。
    • 你不需要对每一行都这样做,这就是数组的用途。
    • 这样——jsbin.com/ujucoc/1——虽然我没有为选择、复选框、单选和按钮做任何特殊的外壳。
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2013-06-09
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多