如何从FieldStorage获取数据?

时间:2017-09-20 21:34:12

标签: python cgi

form= cgi.FieldStorage()
print form

打印:FieldStorage(无,无,'年龄= 10& name = joe')

如何从该表单中获取数据?

我无法使用表单[FieldKey],因为没有字段键。

表单[' age']返回空白字符串

我使用的是Python 2.7

3 个答案:

答案 0 :(得分:2)

其他答案已经解释了请求出现问题的原因以及如何修复它,但我认为更好地理解 FieldStorage 对象可能会有所帮助,以便您可以从错误的请求中恢复。

我基本上能够使用这个复制你的状态:

from cgi import FieldStorage
from StringIO import StringIO

f = FieldStorage(
    fp=StringIO("age=10&name=joe"), 
    headers={"content-length": 15, "content-type": "plain/text"}, 
    environ={"REQUEST_METHOD": "POST"}
)

print(f) # FieldStorage(None, None, 'age=10&name=joe')

这将按预期失败:

f["age"] # TypeError: not indexable
f.keys() # TypeError: not indexable

所以 FieldStorage 没有解析查询字符串,因为它不知道应该这样做,但是您可以让 FieldStorage 手动解析它:

f.fp.seek(0) # we reset fp because FieldStorage exhausted it
# if f.fp.seek(0) fails we can also do this:
# f.fp = f.file
f.read_urlencoded()

f["age"] # 10
f.keys() # ["age", "name"]

如果您需要从 FieldStorage 获取原始正文,您可以从 FieldStorage.file 属性获取它,file 属性会在 FieldStorage 解析它的内容时设置thinks 是一个普通的身体:

f.file.read() # "age=10&name=joe"

希望这能帮助其他在未来偶然发现这个问题的搜索者。

答案 1 :(得分:1)

这是的答案。我不知道出了什么问题。但是,我在这台计算机上没有Python 2。我刚刚在repl.it上运行了一些代码。

这是发生的事情。

FieldStorage on repl.it

它的意思是。显然你的设置有一些特殊之处。如果我想到任何事情,我会回来。

答案 2 :(得分:1)

这是在FieldStorage解析“普通” POST数据时发生的,而不是例如形式。但是,如果HTTP请求的内容类型为Workday,它将知道该怎么做。

这是具有单个发送按钮的HTML文件,单击它后,在将标头设置为Python CGI库喜欢的名称之后,名称和年龄数据将发送到proc.py脚本。

  <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target>

然后proc.py将这些值吐回来:

application/x-www-form-urlencoded