web-dev-qa-db-fra.com

En train de lire POST corps avec bottle.py

Je ne parviens pas à lire une demande POST avec bottle.py.

La demande envoyée a du texte dans son corps. Vous pouvez voir comment cela est fait ici à la ligne 29: https://github.com/kinetica/tries-on.js/blob/master/lib/game.js .

Vous pouvez également voir comment cela se lit sur un client node basé sur la ligne 4: https://github.com/kinetica/tries-on.js/blob/master/masterClient.js .

Cependant, je n'ai pas été en mesure d'imiter ce comportement sur mon client bottle.py. Les docs indiquent que je peux lire le corps brut avec un objet de type fichier, mais que je ne peux obtenir les données ni en utilisant une boucle for sur request.body, ni en utilisant la méthode readlines de request.body.

Je traite la demande dans une fonction décorée avec @route('/', method='POST'), et les demandes arrivent correctement.

Merci d'avance.


MODIFIER:

Le script complet est:

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)
15
Martín Coll

Avez-vous essayé postdata = request.body.read() simple?

L'exemple suivant montre la lecture des données publiées au format brut à l'aide de request.body.read()

Il imprime également dans le fichier journal (pas sur le client) le contenu brut du corps.

Pour afficher l'accès aux propriétés du formulaire, j'ai ajouté renvoyer "nom" et "nom de famille" au client.

Pour tester, j'ai utilisé le client curl en ligne de commande:

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

Le code qui fonctionne pour moi:

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)
16
Jan Vlcinsky

Script simple pour le traitement des données POSTed. Les données POSTées sont écrites dans un terminal et renvoyées au client:

from bottle import get, post, run, request
import sys

@get('/api')
def hello():
    return "This is api page for processing POSTed messages"

@post('/api')
def api():
    print(request.body.getvalue().decode('utf-8'), file=sys.stdout)
    return request.body

run(Host='localhost', port=8080, debug=True)

Script pour POSTing données JSON au script ci-dessus:

import requests
payload = "{\"name\":\"John\",\"age\":30,\"cars\":[ \"Ford\", \"BMW\",\"Fiat\"]}"
url = "localhost:8080/api"
headers = {
  'content-type': "application/json",
  'cache-control': "no-cache"
  }
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
0
Warf