【问题标题】:Flask - What is difference when returning jsonify vs dict?Flask - 返回 jsonify 与 dict 时有什么区别?
【发布时间】:2020-02-29 21:44:57
【问题描述】:

我有路由可以在POST 请求上向用户返回响应。我应要求返回dict。问题是在某些情况下返回 dict 可以正常工作,但有时会引发错误。

谁能解释一下什么是理想的返回类型以及为什么dict 在某些情况下返回是成功的?

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

【问题讨论】:

    标签: python json dictionary flask httpresponse


    【解决方案1】:

    TLDR没有区别。


    基本示例:

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

    发送POST 请求和从/getuser_dict/getuser_jsonify 检索响应是相同的(不相关部分省略):

    > 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
    

    在内部返回 dict 仅检查您返回的对象类型是 stringtupleBaseResponse 还是 dict。当它确定您确实通过isinstance(rv, dict) 返回dict 时,它会在您的dict 对象上调用jsonify(rv) 并返回。

    请查看app.pymake_response 方法。它checks is it a dict object的部分也在那里。

    【讨论】:

    • 感谢您的解释。哪一个被认为更优雅?更简单的第一个选项还是明确的第二个选项?
    • 两种方式都可以,因此您可以使用您认为更适合您的方式。就我个人而言,我使用第一种方法,因为我主要做一些“概念证明”,而且我发现它更容易编写。
    猜你喜欢
    • 2016-03-08
    • 2021-12-26
    • 1970-01-01
    • 2019-10-08
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多