4

我对 python 的 cgi.FieldStorage() 不太熟悉,我在我的项目中遇到了麻烦。基本上,在我的主页上,我有一个名为criteria 的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。所以结果页面也有一个名为criteria的表单,它调用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() 现在是空的。

4

2 回答 2

5

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

此外,您可以尝试将完整的process.pyurl (ie http://localhost/process.py) 放入表单操作中,看看是否有帮助。

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

于 2013-04-23T10:02:30.023 回答
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
于 2013-04-23T09:07:02.647 回答