2013-02-20 9 views
14

Ich habe Probleme beim Lesen einer POST-Anfrage mit bottle.py.Lesen POST Körper mit bottle.py

Die gesendete Anforderung enthält Text in ihrem Körper. Sie können sehen, wie es hier in Zeile 29 gemacht wird: https://github.com/kinetica/tries-on.js/blob/master/lib/game.js.

Sie können auch sehen, wie es auf einem node-basierten Client hier in Zeile 4 gelesen wird: https://github.com/kinetica/tries-on.js/blob/master/masterClient.js.

Allerdings konnte ich dieses Verhalten auf meinem bottle.py-basierten Client nicht nachahmen. Die docs sagen, dass ich den rohen Körper mit einem Datei-ähnlichen Objekt lesen kann, aber ich kann die Daten weder mit einer For-Schleife auf request.body, noch request.bodyreadlines Methode erhalten.

Ich handle die Anfrage in einer Funktion mit @route('/', method='POST') dekoriert, und Anfragen ankommen korrekt.

Vielen Dank im Voraus.


EDIT:

Der komplette Skript ist:

from bottle import route, run, request 

@route('/', method='POST') 
def index(): 
    for l in request.body: 
     print l 
    print request.body.readlines() 

run(host='localhost', port=8080, debug=True) 
+0

Ich dachte, es braucht das 'StringIO' Objekt zurückzuspulen, aber es ist nicht nötig. Können Sie die Python-Funktionen zu Ihrer Frage hinzufügen? –

+0

Natürlich. Ich habe die Antwort aktualisiert. Danke, @ A.Rodas –

+0

Woher wissen Sie, dass Anfragen korrekt ankommen? Was ist die Ausgabe und/oder Rückverfolgung für den Code, den Sie hier gezeigt haben? –

Antwort

13

Haben Sie versucht einfach postdata = request.body.read()?

folgendes Beispiel zeigt gebuchte Daten im Rohformat Lesen request.body.read()

mit Er druckt auch in der Protokolldatei (nicht auf das Client) Rohinhalt des Körpers.

Um den Zugriff auf Formulareigenschaften anzuzeigen, habe ich den Namen "zurück" und "Nachname" zum Client hinzugefügt.

Zum Testen habe ich curl Client von der Kommandozeile:

$ curl -X POST -F name=jan -F surname=vlcinsky http://localhost:8080 

Der Code, der funktioniert für mich:

from bottle import run, request, post 

@post('/') 
def index(): 
    postdata = request.body.read() 
    print postdata #this goes to log file only, not to client 
    name = request.forms.get("name") 
    surname = request.forms.get("surname") 
    return "Hi {name} {surname}".format(name=name, surname=surname) 

run(host='localhost', port=8080, debug=True) 
+0

dies wird kompliziert, als POST einige Dateien angehängt bekommt ... –

Verwandte Themen