2013-02-20 1 views
14

Ho problemi a leggere una richiesta POST con bottle.py.Lettura corpo POST con bottle.py

La richiesta inviata ha un testo nel suo corpo. Puoi vedere come è fatto qui sulla linea 29: https://github.com/kinetica/tries-on.js/blob/master/lib/game.js.

È anche possibile vedere come viene letto su un client basato su node qui sulla riga 4: https://github.com/kinetica/tries-on.js/blob/master/masterClient.js.

Tuttavia, non sono stato in grado di simulare questo comportamento sul mio client basato su bottle.py. Il docs dice che posso leggere il corpo non elaborato con un oggetto simile a un file, ma non riesco a ottenere i dati né utilizzando un ciclo for su request.body, né usando il metodo readlinesrequest.body.

Sto gestendo la richiesta in una funzione decorata con @route('/', method='POST') e le richieste arrivano correttamente.

Grazie in anticipo.


EDIT:

Lo script completo è:

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

ho pensato che era necessario per riavvolgere l'oggetto 'StringIO', ma non è necessario. Potresti aggiungere le funzioni Python alla tua domanda? –

+0

Ovviamente. Ho aggiornato la risposta. Grazie, @ A.Rodas –

+0

Come sai che le richieste arrivano correttamente? Qual è l'output e/o traceback per il codice che hai mostrato qui? –

risposta

13

Hai provato semplice postdata = request.body.read()?

esempio seguente mostra la lettura dei dati pubblicati in formato RAW utilizzando request.body.read()

Esso stampa anche nel file di registro (non al cliente) contenuti grezzo di corpo.

Per mostrare l'accesso alle proprietà del modulo, ho aggiunto "nome" e "cognome" al client.

Per il test, ho usato ricciolo client da riga di comando:

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

Il codice che funziona per me:

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

questo diventa complicato quando POST ottiene alcuni file allegati ... –