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

Dan*_*son 3 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>
Run Code Online (Sandbox Code Playgroud)

如果我将表单更改为指向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
Run Code Online (Sandbox Code Playgroud)

我使用的是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>
Run Code Online (Sandbox Code Playgroud)

Tho*_*ers 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框架,像Django的,TurboGears中,主塔,或上列出的许多人之一,例如,在Web框架页面wiki.python.org

  • 添加到Thomas的响应中,如果使用mod_python.publisher,则已经使用req.form中保留的FieldStorage对象处理POST数据.如果接受index()函数中的参数,则命名的表单参数将在同名的参数中传递.因此,您根本不必担心FieldStorage.请参阅"http://webpython.codepoint.net/mod_python_publisher_form". (2认同)