我正在使用WSGI并尝试使用以下代码访问get / post数据:
import os
import cgi
from traceback import format_exception
from sys import exc_info
def application(environ, start_response):
try:
f = cgi.FieldStorage(fp=os.environ['wsgi.input'], environ=os.environ)
output = 'Test: %s' % f['test'].value
except:
output = ''.join(format_exception(*exc_info()))
status = '200 OK'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
但是我收到以下错误:
Traceback (most recent call last):
File "/srv/www/vm/custom/gettest.wsgi", line 9, in application
f = cgi.FieldStorage(fp=os.environ['wsgi.input'], environ=os.environ)
File "/usr/lib64/python2.4/UserDict.py", line 17, in __getitem__
def __getitem__(self, key): return self.data[key]
KeyError: 'wsgi.input'
是因为我的版本中不存在wsgi.input吗?
答案 0 :(得分:7)
你误导了WSGI API。
请创建一个显示此错误的最小(“hello world”)函数,以便我们对您的代码进行评论。 [不要发布你的整个申请,这可能对我们来说太大而且难以评论。]
os.environ
不是你应该使用的。 WSGI用丰富的环境取而代之。 WSGI应用程序有两个参数:一个是包含'wsgi.input'
的字典。
在您的代码中......
def application(environ, start_response):
try:
f = cgi.FieldStorage(fp=os.environ['wsgi.input'], environ=os.environ)
根据WSGI API规范(http://www.python.org/dev/peps/pep-0333/#specification-details),请勿使用os.environ
。使用environ
,即应用程序的第一个位置参数。
environ参数是字典 对象,包含CGI风格 环境变量。这个对象 必须是内置的Python字典 (不是子类,UserDict或其他 字典模拟),和 应用程序允许修改 它想要的任何方式的字典。该 字典还必须包括一定的 WSGI所需的变量(描述于 稍后部分),也可能包括 服务器特定的扩展变量, 根据一项公约命名 将在下面描述。