I have route which returns response to the user on POST
request. I am returning a dict
on request. The problem is for some cases returning a dict works fine, but sometimes throws an error.
Can anyone please explain what is the ideal return type and why the dict
return is successful for some of the cases ?
@app.route('/getuser', methods = ['post'] )
def getusername():
user = request.json.get("user_name")
# This works good for few cases
return {"username": user}
# Whereas other require this
return jsonify({"username": user})
jsonify() is a helper method provided by Flask to properly return JSON data. jsonify() returns a Response object with the application/json mimetype set, whereas json. dumps() simply returns a string of JSON data.
Jsonify is incredibly useful in building API that is used by someone who expects the return object to be in json as this might be one of the constraint of the bigger application which uses the API from this flask web application.
jsonify is a function in Flask's flask. json module. jsonify serializes data to JavaScript Object Notation (JSON) format, wraps it in a Response object with the application/json mimetype. Note that jsonify is sometimes imported directly from the flask module instead of from flask. json .
TLDR: There is no difference.
Basic example:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/getuser_dict', methods=['POST'])
def getuser_dict():
user = request.json.get("user_name")
return {"username": user}
@app.route('/getuser_jsonify', methods=['POST'])
def getuser_jsonify():
user = request.json.get("user_name")
return jsonify({"username": user})
if __name__ == '__main__':
app.run()
Sending POST
request and retrieving response from both /getuser_dict
and /getuser_jsonify
are same (irrelevant parts left out):
> POST ...
> Host: 127.0.0.1:5000
> User-Agent: insomnia/7.0.3
> Content-Type: application/json
> Accept: */*
> Content-Length: 24
| {
| "user_name": "John"
| }
* upload completely sent off: 24 out of 24 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: application/json
< Content-Length: 20
< Server: Werkzeug/0.16.0 Python/3.6.8
< Date: Wed, 06 Nov 2019 09:34:51 GMT
* Received 20 B chunk
* Closing connection 65
Returning dict
internally only checks what type of object are you returning, is it string
, tuple
, BaseResponse
or dict
. When it determines you really return dict
by isinstance(rv, dict)
, it calls jsonify(rv)
on your dict
object and returns.
Please take a look at make_response method of app.py
. The part where it checks is it a dict object is also there.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With