Pourquoi ai-je une erreur, KeyError: 'wsgi.input'?
Question
J'utilise WSGI et j'essaie d'accéder aux données get / post en utilisant ce code:
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]
Cependant, le message d'erreur suivant s'affiche:
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'
Est-ce parce que wsgi.input n'existe pas dans ma version?
La solution
Vous utilisez mal l’ API WSGI .
Veuillez créer une fonction minimale ("hello world") indiquant cette erreur afin que nous puissions commenter votre code. [Ne postez pas l'intégralité de votre candidature, elle risque d'être trop volumineuse et trop lourde pour que nous puissions faire des commentaires.]
Le os.environ
n'est pas ce que vous devriez utiliser. WSGI remplace ceci par un environnement enrichi. Une application WSGI obtient deux arguments: l'un est un dictionnaire qui inclut 'wsgi.input'
.
Dans votre code ...
def application(environ, start_response):
try:
f = cgi.FieldStorage(fp=os.environ['wsgi.input'], environ=os.environ)
Selon les spécifications de l'API WSGI ( http: //www.python .org / dev / peps / pep-0333 / # détails-de-spécifications ), n'utilisez pas os.environ
. Utilisez environ
, le premier paramètre de position de votre application.
Le paramètre environ est un dictionnaire objet, contenant le style CGI Variables d'environnement. Cet objet doit être un dictionnaire Python intégré (pas une sous-classe, UserDict ou autre dictionnaire émulation), et le l'application est autorisée à modifier le dictionnaire de quelque façon qu'il désire. le dictionnaire doit également inclure certains Variables requises par WSGI (décrites dans une section ultérieure), et peut également inclure variables d'extension spécifiques au serveur, nommé selon une convention qui sera décrit ci-dessous.