form= cgi.FieldStorage()
print form
打印:
FieldStorage(None, None, 'age=10&name=joe')
。
如何从该表格获取数据?
我无法使用
form[FieldKey]
,因为没有字段键。
form['age']
返回空字符串
我使用的是Python 2.7。
当 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
其他答案已经解释了请求出现问题的原因以及如何修复它,但我认为更好地理解
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"
希望这对将来偶然发现这个问题的其他搜索者有所帮助。
你可以试试
import cgi
form = cgi.FieldStorage()
print form.getvalue("age")
如更一般的线程中所述 Python 中如何处理 POST 和 GET 变量?
这不是答案。我不知道出了什么问题。但是,我这台计算机上没有 Python 2。我刚刚在 repl.it.
上运行了一些代码事情是这样的。
它按预期工作。显然你的设置有一些奇怪的地方。如果我想到什么我会回来的。