1

我正在使用 WSGI 并尝试使用以下代码访问获取/发布数据:

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 在我的版本中不存在吗?

4

1 回答 1

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 所需的变量(在后面的部分中描述),并且还可能包括特定于服务器的扩展变量,根据将在下面描述的约定命名。

于 2009-09-17T20:11:33.013 回答