为什么我会收到错误,KeyError:'wsgi.input'?

时间:2009-09-17 20:02:46

标签: python mod-wsgi

我正在使用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吗?

1 个答案:

答案 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所需的变量(描述于   稍后部分),也可能包括   服务器特定的扩展变量,   根据一项公约命名   将在下面描述。