为什么Web表单将字段作为MiniFieldStorage返回到Python CGI?

时间:2018-08-10 15:35:28

标签: python web cgi

我正在尝试从一个Python脚本生成的网页中获取用户输入的数据,然后提交给另一个Python脚本来处理该数据。在第一个python脚本中,我使用以下代码创建了一个Web表单来提交数据:

print("<form action='newspeciescheck.py' method='post'>")
print("<p>Genus: <input  type='text' name='newgenus'/> <p>Species: <input type='text' name='newspecies'/>")
print("<input type='submit' value='Enter'>")
print("</form>\n ")

在我拥有的目标脚本中

formfields = cgi.FieldStorage()
newgenus = formfields.getValue('newgenus')
newspecies = formfields.getValue('newspecies')

但是,当我尝试运行此命令时,cgitb会抛出一个错误告诉我:

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.


C:\Abyss Web Server\htdocs\pyscripts\newspeciescheck.py in ()
     21 
     22 formfields = cgi.FieldStorage()
=>   23 newgenus = formfields.getValue('newgenus')
     24 status=''
     25 if newgenus==None:
newgenus undefined, formfields = FieldStorage(None, None, [MiniFieldStorage('newg...phis'), MiniFieldStorage('newspecies', 'fabae')]), formfields.getValue undefined
 C:\Users\John\AppData\Local\Programs\Python\Python36\lib\cgi.py in __getattr__(self=FieldStorage(None, None, [MiniFieldStorage('newg...phis'), MiniFieldStorage('newspecies', 'fabae')]), name='getValue')
    583     def __getattr__(self, name):
    584         if name != 'value':
=>  585             raise AttributeError(name)
    586         if self.file:
    587             self.file.seek(0)
builtin AttributeError = <class 'AttributeError'>, name = 'getValue'
AttributeError: getValue 
      args = ('getValue',) 
      with_traceback = <built-in method with_traceback of AttributeError object>

那么,为什么我提交的值最终存储在MiniFieldStorage中而不是普通的FieldStorage中?更重要的是,如何使它们最终像普通的FieldStorage一样?

1 个答案:

答案 0 :(得分:2)

您看到此错误是因为您尝试访问FieldStorage的{​​{1}}方法,该方法没有一个-正确的方法名称为getValue-注意小写的v

但是,这是您关于getvalueFieldStorage的问题的答案

根据documentation,值最终以MiniFieldStorage还是FieldStorage实例结尾,取决于提交表单的编码类型(MiniFieldStorage属性)

  

文件上传草案标准具有上传的可能性   来自一个字段的多个文件(使用递归multipart / *   编码)。发生这种情况时,该项目将像字典一样   FieldStorage项目。可以通过测试其类型来确定   属性,应该是multipart / form-data(或其他   MIME类型匹配multipart / *)。在这种情况下,可以对其进行迭代   像顶级表单对象一样递归。

     

以“旧”格式提交表单时(作为查询字符串或   作为application / x-www-form-urlencoded类型的单个数据部分),   这些项实际上是MiniFieldStorage类的实例。

default encoding typeenctype,因此,如果要强制使用application/x-www-form-urlencoded,则表单声明必须为

FieldStorage

请参阅this answer,以获取有关表单编码以及为何选择其中一种的讨论。