I'm trying to write a simple server frontend to a python3 application, using a restful JSON-based protocol. So far, bottle seems the best suited framework for the task (it supports python3, handles method dispatching in a nice way, and easily returns JSON.) The problem is parsing the JSON in the input request.
The documentation only mention request.fields
and request.files
, both I assume refer to multipart/form-data data. No mention of accessing the request data directly.
Peeking at the source code, I can see a request.body
object of type BytesIO. json.load
refuses to act on it directly, dying in the json lib with can't use a string pattern on a bytes-like object
. The proper way to do it may be to first decode the bytes to unicode characters, according to whichever charset was specified in the Content-Type
HTTP header. I don't know how to do that; I can see a StringIO class and assume it may hold a buffer of characters instead of bytes, but see no way of decoding a BytesIO to a StringIO, if this is even possible at all.
Of course, it may also be possible to read the BytesIO object into a bytestring, then decode it into a string before passing it to the JSON decoder, but if I understand correctly, that breaks the nice buffering behavior of the whole thing.
Or is there any better way to do it ?
As mentioned in a comment (and in a similar SO answer), the request.json
method was made available from bottle 0.1.0.
So like:
@route('/endpoint', method='POST')
def parse():
body = request.json
name = body.get('name')
age = body.get('age')