Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask - What is difference when returning jsonify vs dict?

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})
like image 343
Chandru Jc Avatar asked Nov 04 '19 14:11

Chandru Jc


People also ask

What is Jsonify return Flask?

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.

Do you need Jsonify in Flask?

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.

What is Jsonify in Python?

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 .


1 Answers

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.

like image 128
Dinko Pehar Avatar answered Sep 20 '22 07:09

Dinko Pehar