Python cgi.FieldStorage() 在表单提交时为空

1 投票
2 回答
1935 浏览
提问于 2025-04-18 03:01

我在Apache 2的虚拟主机配置中有以下指令:

<Directory /var/www/foo_test>
  Options MultiViews +ExecCGI
  AddHandler cgi-script .py
  AllowOverride All 
</Directory>

我有一个简单的HTML表单:

<html>
  <body>
    <form action="foo.py" method="post" id="foo_form">
      <input type="text" id="foo" />
      <input type="submit" />
    </form>
  </body>
</html>

这是一个叫做foo.py的可执行脚本,当表单提交时会被调用:

#!/usr/bin/env python

import cgi
arguments = cgi.FieldStorage()

print "Content-Type: text/html\n"
print repr(arguments)

当我提交表单时,我收到以下响应:

FieldStorage(None, None, [])

FieldStorage这个对象中,没有包含表单foo_form中指定字段的值。

如果我把Python脚本换成Perl脚本,并使用它的CGI模块,同时调整Apache的指令来处理Perl的CGI,我就能顺利读取表单中的字段。这让我觉得我的Apache设置是没问题的。

但是,我在创建cgi.FieldStorage()对象时,或者在Apache的设置上,有没有什么我遗漏的地方,导致表单提交失败呢?

2 个回答

0

这让我大吃一惊,但我遇到了这样的情况。

显然,你不能从 cgi.FieldStorage 中获取信息超过一次?

在浏览器的任何 console 标签中运行:

$.post('/api/save.cgi', {'hello': 'world'}, (response) => {
   console.log("DONE");
});

后端的 Python 代码

#!/usr/bin/env python3

import cgi

fcgi = cgi.FieldStorage()
sys.stderr.write("try 1 %s \n" % fcgi)

fcgi = cgi.FieldStorage()
sys.stderr.write("try 2: %s \n" % fcgi)

查看错误日志:

try 1: FieldStorage(None, None, [MiniFieldStorage('hello', 'world')])
try 2: FieldStorage(None, None, [])
2

如果你想让输入框里的数据在表单提交时被发送出去,你需要给这个输入框加一个 name 属性。

撰写回答