2008-12-26 18 views
15

To musi być bardzo proste pytanie, ale wydaje mi się, że nie potrafię tego rozgryźć.Dane Python POST za pomocą mod_wsgi

Używam apache + mod_wsgi do hostowania mojej aplikacji python i chciałbym, aby treść postu została przesłana w jednej z postaci - jednak ani wartości środowiskowe, ani sys.stdin nie zawierają żadnych z tych danych . Umysł daje mi szybką rękę?

Edycja: Próbowano już:

  • środo [ "CONTENT_TYPE"] = 'application/x-www postać urlencoded' (brak danych)
  • środo [ "wsgi.input"] Wydaje prawdopodobny sposób jednak, zarówno environ ["wsgi.input"]. read(), i environ ["wsgi.input"]. read (-1) zwraca pusty ciąg (tak, treść została wysłana, a environ [ "REQUEST_METHOD"] = "post"

Odpowiedz

22

PEP 333 mówi you must read environ['wsgi.input'].

Właśnie zapisałem poniższy kod i uruchomiłem mod_wsgi w Apache. To działa.

Musisz zrobić coś złego.

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 
+0

mamy zwycięzcę! dziękuję :) –

+2

To zablokowane, dla mnie. Zostało to rozwiązane przez odczytanie dokładnej liczby bajtów: 'length = int (environ.get ('CONTENT_LENGTH', '0'))' i '... read (length)'. Jest to zgodne z faktem, że dokumentacja związana z * nie * wspomina o 'read()' (bez długości) jako wymagającym obsługi. – EOL

13

Należy pamiętać, że z technicznego punktu widzenia wzywając read() lub przeczytać (-1) na wsgi.input stanowi naruszenie specyfikacji WSGI chociaż Apache/mod_wsgi na to pozwala. Wynika to z faktu, że specyfikacja WSGI wymaga podania prawidłowego argumentu długości. Specyfikacja WSGI mówi również, że nie powinieneś czytać więcej danych niż określono w CONTENT_LENGTH.

Powyższy kod może działać w Apache/mod_wsgi, ale nie jest przenośnym kodem WSGI i zawiedzie w niektórych innych implementacjach WSGI. Aby być poprawnym, określ długość treści żądania i podaj tę wartość do odczytu().