I'm trying to build a simple API using Flask, in which I now want to read some POSTed JSON. I do the post with the PostMan Chrome extension, and the JSON I post is simply {"text":"lalala"}
. I try to read the JSON using the following method:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content
return uuid
On the browser it correctly returns the uuid I put in the GET, but on the console, it just prints out None
(where I expect it to print out the {"text":"lalala"}
. Does anybody know how I can get the posted JSON from within the Flask method?
For reference, here's complete code for how to send json from a Python client:
The "json=" input will automatically set the content-type, as discussed here: Post JSON using Python Requests
And the above client will work with this server-side code:
This solution works:
You need to set the request content type to
application/json
for the.json
property to work; it'll beNone
otherwise. See the FlaskRequest
documentation:Flask 0.10 added the
request.get_json()
method, and you should use that method instead of the.json
property. You can tell the method to skip the content type requirement by settingforce=True
.Note that if an exception is raised at this point (possibly resulting in a 400 Bad Request response), your JSON data is invalid. It is in some way malformed; you may want to check it with a JSON validator.
This is the way I would do it and it should be
With
silent=True
set, theget_json
function will fail silently when trying to retrieve the json body. By default this is set toFalse
.Setting
force=True
will ignore therequest.headers.get('Content-Type') == 'application/json'
check that flask does for you. By default this is also set toFalse
.See flask documentation.
I would strongly recommend leaving
force=False
and make the client send theContent-Type
header to make it more explicit.Hope this helps!