Convert Flask's request.get_json dict into a MultiDict like request.form
This was written to maintain a consistent API for interacting with both request.form
and request.get_json()
. This allows use to leverage .get
with type coercion and .getlist
.
Install the module with: pip install flask_json_multidict
# Load in our dependencies
from flask import Flask, request, jsonify
from flask_json_multidict import get_json_multidict
# Start an application
app = Flask(__name__)
def resolve_request_body():
"""Before every request, resolve `request.body` from either `request.form` or `request.get_json()`"""
request.body = request.form
if request.headers['content-type'] == 'application/json':
request.body = get_json_multidict(request)
app.before_request(resolve_request_body)
@app.route('/', methods=['POST'])
def root():
"""Reply with POST data as we see it"""
body = request.body
return jsonify({key: body[key] for key in body})
# We can also leverage `request.body.getlist` as we do with `request.form`
if __name__ == '__main__':
app.run()
# $ curl http://localhost:5000/ -X POST --data 'hello=world'
# {"hello": "world"}
# $ curl http://localhost:5000/ -X POST -H 'Content-Type: application/json' --data '{"hello": "world"}
# {"hello": "world"}
flask-json-multidict
can be imported via flask_json_multidict
.
get_json_multidict
walks over the json
provided by request.get_json()
and returns a MultiDict.
- request
object
- Currentrequest
being handled by Flask
Returns:
- body
object
- MultiDict withjson
information - If there were any dictionaries or nested lists, then these will be ignored as parameters
- This is for consistency with how
request.form
behaves
- This is for consistency with how
- body
# Assume we receive `{"colors": ["red", "blue"]}`
body = get_json_multidict(request)
body.getlist('colors') # ['red', 'blue']
# Assume we receive `{"hello": "world"}`
body = get_json_multidict(request)
body.['hello'] # 'world'
body.get('hello') # 'world'
# Assume we receive `{"foo": {"bar": "baz"}}`
# This is the silent ignore of bad parameters
body = get_json_multidict(request)
body.get('foo') # None
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Test via nosetests
.
Copyright (c) 2015 Underdog.io
Licensed under the MIT license.