Reputation: 105
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})
Upvotes: 7
Views: 1693
Reputation: 6061
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.
Upvotes: 11