cgi.FieldStorage始终为空 - 永远不会返回POSTed表单数据

时间:2010-05-06 13:31:16

标签: python apache cgi mod-python

这个问题可能很简单。

我正试图让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 conf文件中的内容(我的脚本位于/ 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 个答案:

答案 0 :(得分:6)

你的问题是你混合了两种不同的方法:CGI和mod_python。您将脚本声明为mod_python发布者,这就是调用其index方法的原因 - 这也使其成为模块,而不是脚本。

如果你使用的是CGI,你可以从Apache配置中删除mod_python指令,只需离开ExecCGI,然后重命名脚本以获得.cgi扩展名或设置.py的处理程序扩展为CGI。然后您的脚本将作为脚本执行,这意味着您在脚本中定义的index函数将不会被执行,除非您从脚本的顶层调用它。

我记得 - 但是我用mod_python打了很长时间 - 如果你想改用mod_python,你应该使用mod_python.util.FieldStorage而不是cgi.FieldStorage来访问POST数据

所有这一切,很多更好的选择,对于简单的网络内容是WSGI,例如通过mod_wsgi。通常比简单的web内容更好的选择是使用Web框架,例如DjangoTurboGearsPylons,或者列出的许多其他内容之一,例如{ {3}}