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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top