简体   繁体   中英

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})

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM