¿Por qué recibo un error, KeyError: 'wsgi.input'?
Pregunta
Estoy usando WSGI e intento acceder a los datos get / post, usando este código:
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]
Sin embargo, aparece el siguiente error:
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'
¿Es porque wsgi.input no existe en mi versión?
Solución
Está haciendo mal uso de la API WSGI .
Cree una función mínima (" hello world ") que muestre este error para que podamos comentar su código. [No publique su solicitud completa, puede ser demasiado grande y difícil de manejar para que comentemos.]
El os.environ
no es lo que debería estar usando. WSGI reemplaza esto con un entorno enriquecido. Una aplicación WSGI obtiene dos argumentos: uno es un diccionario que incluye 'wsgi.input'
.
En su código ...
def application(environ, start_response):
try:
f = cgi.FieldStorage(fp=os.environ['wsgi.input'], environ=os.environ)
Según la especificación de la API WSGI ( http: //www.python .org / dev / peps / pep-0333 / # especificación-detalles ), no use os.environ
. Utilice environmental
, el primer parámetro posicional de su aplicación.
El parámetroiron es un diccionario objeto, que contiene estilo CGI Variables de entorno. Este objeto debe ser un diccionario de Python incorporado (no una subclase, UserDict u otro emulación de diccionario) y el la aplicación puede modificar el diccionario de cualquier manera que desee. los el diccionario también debe incluir ciertos Variables requeridas por WSGI (descritas en una sección posterior), y también puede incluir variables de extensión específicas del servidor, nombrado de acuerdo con una convención que se describirá a continuación.