cgi.FieldStorage 总是为空 - 从未返回 POST 的表单数据
这个问题可能看起来很简单。
我正在尝试学习Python。我觉得一个好的开始方式是创建一个简单的CGI脚本来处理一些表单数据并做一些有趣的事情。我的Python脚本在Apache服务器上通过mod_python运行得很好,可以输出我想要的任何内容。
我唯一的问题是cgi.FieldStorage()总是返回空。我尝试过使用POST和GET方法。每次尝试时,我都会填写表单的所有字段。
<form action="pythonScript.py" method="POST" name="ARGH">
<input name="TaskName" type="text" />
<input name="TaskNumber" type="text" />
<input type="submit" />
</form>
如果我把表单指向一个Perl脚本,它就能正确报告表单数据。而Python页面总是给我同样的结果:键的数量:0
#!/usr/bin/python
import cgi
def index(req):
pageContent = """<html><head><title>A page from"""
pageContent += """Python</title></head><body>"""
form = cgi.FieldStorage()
keys = form.keys()
keys.sort()
pageContent += "<br />number of keys: "+str(len(keys))
for key in keys:
pageContent += fieldStorage[ key ].value
pageContent += """</body></html>"""
return pageContent
我使用的是Python 2.5.2和Apache/2.2.3。这是我apache配置文件中的内容(我的脚本在/var/www/python):
<Directory /var/www/python/>
Options FollowSymLinks +ExecCGI
Order allow,deny
allow from all
AddHandler mod_python .py
PythonHandler mod_python.publisher
</Directory>
1 个回答
你的问题在于你把两种不同的方法搞混了:CGI和mod_python。你把你的脚本声明为mod_python的发布者,这就是为什么它的index
方法会被调用——这也意味着它是一个模块,而不是一个普通的脚本。
如果你使用的是CGI,你需要从Apache的配置中去掉mod_python的指令,只保留ExecCGI,然后把脚本重命名为以.cgi
结尾,或者把.py
扩展名的处理方式设置为CGI。这样你的脚本就会作为一个普通的脚本执行,这意味着你在脚本中定义的index
函数不会被执行,除非你在脚本的顶层调用它。
我记得——不过我很久没碰过mod_python了——如果你想使用mod_python,你应该用mod_python.util.FieldStorage
来获取POST数据,而不是cgi.FieldStorage
。
不过说实话,对于一些简单的网页功能,更好的选择是使用WSGI,比如通过mod_wsgi。而且通常比简单的网页功能更好的选择是使用一个网页框架,比如Django、TurboGears、Pylons,或者其他在wiki.python.org的网页框架页面上列出的许多框架。