Чтение тела POST с bottle.py

У меня проблемы с чтением запроса POST с bottle.py,

Отправленный запрос имеет некоторый текст в своем теле. Вы можете увидеть, как это сделано, в строке 29: https://github.com/kinetica/tries-on.js/blob/master/lib/game.js.

Вы также можете увидеть, как это читается на nodeклиент на основе строки 4: https://github.com/kinetica/tries-on.js/blob/master/masterClient.js.

Тем не менее, я не смог имитировать это поведение на моем bottle.pyклиент В документах говорится, что я могу читать необработанное тело с помощью файлового объекта, но я не могу получить данные, используя цикл for request.bodyни с помощью request.body"s readlines метод.

Я обрабатываю запрос в функции, украшенной @route('/', method='POST')и запросы приходят правильно.

Заранее спасибо.


РЕДАКТИРОВАТЬ:

Полный сценарий:

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)

2 ответа

Ты пробовал просто postdata = request.body.read()?

В следующем примере показано чтение опубликованных данных в необработанном формате с использованием request.body.read()

Он также печатает в файле журнала (не на клиенте) необработанное содержимое тела.

Чтобы показать доступ к свойствам формы, я добавил возврат "имени" и "фамилии" клиенту.

Для тестирования я использовал клиент curl из командной строки:

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

Код, который работает для меня:

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)

Простой скрипт для обработки POST-данных. POSTed-данные записываются в терминал и возвращаются клиенту:

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)

Скрипт для размещения данных JSON в скрипт выше:

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)
Другие вопросы по тегам