pythonjsonpostflask

How to get POSTed JSON in Flask?


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":"hello world"}. 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":"hello world"}. Does anybody know how I can get the posted JSON from within the Flask method?


Solution

  • 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:

    The parsed JSON data if mimetype indicates JSON (application/json, see .is_json).

    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 415 Unsupported Media Type response), your JSON data is invalid. It is in some way malformed; you may want to check it with a JSON validator.