Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading POST body with bottle.py

I am having trouble reading a POST request with bottle.py.

The request sent has some text in its body. You can see how it's made here on line 29: https://github.com/kinetica/tries-on.js/blob/master/lib/game.js.

You can also see how it's read on a node-based client here on line 4: https://github.com/kinetica/tries-on.js/blob/master/masterClient.js.

However, I haven't been able to mimic this behavior on my bottle.py-based client. The docs say that I can read the raw body with a file-like object, but I can't get the data neither using a for loop on request.body, nor using request.body's readlines method.

I'm handling the request in a function decorated with @route('/', method='POST'), and requests arrive correctly.

Thanks in advance.


EDIT:

The complete script is:

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)
like image 850
Martín Coll Avatar asked Feb 20 '13 20:02

Martín Coll


People also ask

What is bottle API?

Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module and has no dependencies other than the Python Standard Library. Routing: Requests to function-call mapping with support for clean and dynamic URLs.

What is the major function for running a bottle app?

Bottle applications implement routing by calling a single Python function for each URL requested. It then returns the results of the function to the user.

How do I stop a bottle server?

When starting a bottle webserver without a thread or a subprocess, there's no problem. To exit the bottle app -> CTRL + c .


2 Answers

Did you try simple postdata = request.body.read() ?

Following example shows reading posted data in raw format using request.body.read()

It also prints to the log file (not to the client) raw content of body.

To show accessing of form properties, I added returning "name" and "surname" to the client.

For testing, I used curl client from command line:

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

The code which works for 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)
like image 194
Jan Vlcinsky Avatar answered Oct 06 '22 13:10

Jan Vlcinsky


Simple script for processing POSTed data. POSTed data are written in a terminal and returned to the 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 for POSTing json data to the script above:

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)
like image 36
Warf Avatar answered Oct 06 '22 13:10

Warf