Python données POST en utilisant mod_wsgi
Question
Cela doit être une question sembler très simple, mais je ne pas être en mesure de comprendre.
J'utilise apache + mod_wsgi pour héberger mon application python, et je voudrais obtenir le contenu du message soumis dans l'une des formes -cependant, ni les valeurs de l'environnement, ni sys.stdin contient aucune de ces données. L'esprit de me donner un coup de main rapide?
Edit: Essayé déjà:
- environ [ "CONTENT_TYPE"] = 'application / x-www-form-urlencoded' (pas de données)
- environ [ "wsgi.input"] semble une manière plausible, cependant, à la fois environ [ "wsgi.input"]. Read () et environ [ "wsgi.input"]. Lecture (-1) retourne un vide chaîne (oui, le contenu a été publié, et environ [ "REQUEST_METHOD"] = "post"
La solution
PEP 333 dit vous devez lire environ [ 'wsgi.input'] .
Je viens de sauver le code suivant et fait de mod_wsgi apache exécuter. Il fonctionne.
Vous devez faire quelque chose de mal.
from pprint import pformat
def application(environ, start_response):
# show the environment:
output = ['<pre>']
output.append(pformat(environ))
output.append('</pre>')
#create a simple form:
output.append('<form method="post">')
output.append('<input type="text" name="test">')
output.append('<input type="submit">')
output.append('</form>')
if environ['REQUEST_METHOD'] == 'POST':
# show form data as received by POST:
output.append('<h1>FORM DATA</h1>')
output.append(pformat(environ['wsgi.input'].read()))
# send results
output_len = sum(len(line) for line in output)
start_response('200 OK', [('Content-type', 'text/html'),
('Content-Length', str(output_len))])
return output
Autres conseils
Soyez conscient que techniquement parlant appelant read () ou lire (-1) sur wsgi.input est une violation de la spécification WSGI même si Apache / mod_wsgi permet. En effet, la spécification WSGI exige qu'un argument de longueur valide être fournie. La spécification WSGI dit aussi que vous ne devriez pas lire plus de données que spécifié par le CONTENT_LENGTH.
Ainsi, le code ci-dessus peut travailler dans Apache / mod_wsgi mais pas du code portable WSGI et échouera sur d'autres implémentations WSGI. Pour être correct, déterminer la longueur du contenu de la demande et de fournir cette valeur à lire ().