Почему я получаю ошибку, KeyError: 'wsgi.input'? - PullRequest
1 голос
/ 18 сентября 2009

Я использую 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 Ответ

7 голосов
/ 18 сентября 2009

Вы неправильно используете 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)

В соответствии со спецификацией API WSGI (http://www.python.org/dev/peps/pep-0333/#specification-details), не используйте os.environ. Используйте environ, первый позиционный параметр для вашего приложения.

Параметр Environment представляет собой словарь объект, содержащий CGI-стиль переменные среды Этот объект должен быть встроенный словарь Python (не подкласс, UserDict или другой эмуляция словаря), а Приложение может изменять словарь любым способом, который он хочет. словарь должен также включать определенные Переменные, необходимые для WSGI (описано в более поздний раздел), и может также включать специфичные для сервера переменные расширения, назван в соответствии с соглашением, которое будет описано ниже.

...