如何从FieldStorage获取数据?

问题描述 投票:0回答:4
form= cgi.FieldStorage()
print form

打印:

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

如何从该表格获取数据?

我无法使用

form[FieldKey]
,因为没有字段键。

form['age']
返回空字符串

我使用的是Python 2.7。

python python-2.7 cgi
4个回答
2
投票

当 FieldStorage 解析“纯”POST 数据(而不是表单)时,就会发生这种情况。然而,如果 HTTP 请求的内容类型是

application/x-www-form-urlencoded
,它就会知道要做什么。

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

<html><body>
<button type="button" onclick="sendData()">Send</button>
<div id="content">No reponse from script yet.</div>
<script>
function sendData() {
    var http = new XMLHttpRequest();
    http.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
        document.getElementById('content').innerHTML = this.responseText;
        }
    };
    http.open('POST', '/cgi-bin/proc.py', true);
    http.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
    http.send('age=10&name=joe');
}
</script>
</body></html>

并且 proc.py 将这些值返回:

#!/usr/bin/env python
import cgi
data = cgi.FieldStorage()
print 'Content-type: text/html\n'
print data['name'].value
print '<br />'
print data['age'].value

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
属性:

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

希望这对将来偶然发现这个问题的其他搜索者有所帮助。


2
投票

你可以试试

import cgi

form = cgi.FieldStorage()
print form.getvalue("age")

如更一般的线程中所述 Python 中如何处理 POST 和 GET 变量?


1
投票

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

上运行了一些代码

事情是这样的。

它按预期工作。显然你的设置有一些奇怪的地方。如果我想到什么我会回来的。

© www.soinside.com 2019 - 2024. All rights reserved.