Flask - 返回 jsonify 和 dict 有什么区别?

7

我有一个路由,用于响应用户的POST请求。我返回一个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})
1个回答

11
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返回检查要返回的对象类型,是否为stringtupleBaseResponsedict。当它通过isinstance(rv, dict)确定你确实返回了dict时,它会在你的dict对象上调用jsonify(rv)并返回。

请查看app.pymake_response方法。它的检查是否为字典对象的部分也在那里。


谢谢您的解释。哪个更优雅?第一个选项因为更简单还是第二个选项因为更明确? - Daniel Lema
1
两种方法都可以,所以您可以使用您认为更适合自己的方法。对于我个人而言,我使用第一种方法,因为我大多数时候都在做一些“概念验证”,我发现这样写起来更容易。 - Dinko Pehar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接