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"
Était-ce utile?

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 ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top