gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 16:44:48 30 4
gpt4 key购买 nike

我正在尝试让 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

编辑

我取得了一些进步,但仍然不是我所希望的。我更改了以下 block :

    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”参数。

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

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

最佳答案

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

关于javascript - Python/CGI/Ajax : cgi. FieldStorage 不接收参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14992640/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com