How to get POSTed JSON in Flask? How to get POSTed JSON in Flask? python python

How to get POSTed JSON in Flask?


First of all, the .json attribute is a property that delegates to the request.get_json() method, which documents why you see None here.

You need to set the request content type to application/json for the .json property and .get_json() method (with no arguments) to work as either will produce None otherwise. See the Flask Request documentation:

This will contain the parsed JSON data if the mimetype indicates JSON (application/json, see is_json()), otherwise it will be None.

You can tell request.get_json() to skip the content type requirement by passing it the force=True keyword argument.

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.


For reference, here's complete code for how to send json from a Python client:

import requestsres = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})if res.ok:    print res.json()

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:

from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])def add_message(uuid):    content = request.json    print content['mytext']    return jsonify({"uuid":uuid})if __name__ == '__main__':    app.run(host= '0.0.0.0',debug=True)


This is the way I would do it and it should be

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])def add_message(uuid):    content = request.get_json(silent=True)    # print(content) # Do your processing    return uuid

With silent=True set, the get_json function will fail silently when trying to retrieve the json body. By default this is set to False. If you are always expecting a json body (not optionally), leave it as silent=False.

Setting force=True will ignore the request.headers.get('Content-Type') == 'application/json' check that flask does for you. By default this is also set to False.

See flask documentation.

I would strongly recommend leaving force=False and make the client send the Content-Type header to make it more explicit.

Hope this helps!