多次调用Python cgi fieldstorage

时间:2013-04-23 08:19:10

标签: python cgi

我对python的cgi.FieldStorage()不太熟悉,我在项目中遇到了麻烦。基本上,在我的主页上,我有一个名为标准的html表单。表单的操作调用process.py,它使用FieldStorage()从表单获取输入并生成新的结果页面。它第一次加载正常。

 <form action="process.py" name="SearchForm">
 <select id="criterion">
        <option value="None">None</option>
        <option value="result1">Result 1</option>
        <option value="result2">Result 2</option>
    </select>
 <input type = "submit">
 </form>

我的问题是在我的process.py中,我使用Python生成与主页面相同的html。因此,结果页面还有一个称为条件的表单,它调用process.py。但是,如果我再次在表单中输入内容,则调用process.py但cgi.FieldStorage完全为空。有可能解决这个问题吗?

编辑:在我的process.py

import cgi

form = cgi.FieldStorage() 
if 'criterion' in form:
table_name = form['criterion'].value


print "Content-Type: text/html\r\n\r\n"
print """\
  <html>
   <head></head>
   <body>  
  <form action="process.py" name="SearchForm">
    <select id="criterion">
        <option value="None">None</option>
        <option value="result1">Result 1</option>
        <option value="result2">Result 2</option>
    </select>
 <input type = "submit">
 </form>"""
 select(table_name)  

打印“”“\\ “”“

这不是我的所有代码,但这是它的要点。 select(table_name)是用于根据条件的值生成信息的python方法。再次调用process.py,但cgi.fieldstorage()现在为空。

2 个答案:

答案 0 :(得分:5)

cgi.FieldStorage()使用标准输入,因此应该只实例化一次。你确定在任何条件下都不再实例化它吗?该问题的推荐解决方案是将第一个实例放在变量中,并将其作为参数传递给需要访问请求数据的函数。

此外,您可以尝试在表单操作中添加完整的process.py网址(即http://localhost/process.py),看看是否有帮助。

来源:http://docs.python.org/2/library/cgi.html

答案 1 :(得分:0)

我认为代码会给你一个例外,所以你总是可以使用try / except。这不是最好的方法,但我想它可能有用。

flag = True
try:
    form = cgi.FieldStorage() 
    if 'criterion' in form:
        table_name = form['criterion'].value
exception:
    # you catch the exception
    flag = False

现在使用flag可以控制FieldStorage为空的情况:

if flag:
    select(table_name)  
else:
    # do whatever
    pass