其他分享
首页 > 其他分享> > Flask 中使用 jsonify 和 json.dumps 的区别?

Flask 中使用 jsonify 和 json.dumps 的区别?

作者:互联网

Flask提供了 jsonify 函数供用户处理返回的序列化 json 数据,而 python 自带的 json 库中也有 dumps 方法可以序列化 json 对象。

那么在Flask 的视图函数中 return 它们会有什么不同之处呢?

想必开始很多人和我一样搞不清楚,只知道既然框架提供了方法就用,肯定不会错。

但作为开发人员,我们需要弄清楚开发过程中各种实现方式的特点和区别,这样在我们面对不同的需求时才能做出相对合理的选择,而不是千篇一律地使用自己熟悉的。下面我就 jsonify 和 json.dumps 的区别这一问题简单探讨一下。

 

一、实验案例:

Python 的 Flask 框架为用户提供了直接返回包含 json 格式数据响应的方法,即 jsonify,在开发中会经常用到。

如下一段简单的 Flask 后端代码,服务端视图函数根据请求参数返回 json 格式的数据到客户端。

from flask import Flask
from flask import jsonify
from flask import Response

app = Flask(__name__)

@app.route('/hello/<name>/<words>', methods=['GET'])
def hello(name, words):

    # 也可以传入key=value形式的参数,如jsonify(name=name,words=words)
    return jsonify({'name': name, 'words': words})


if __name__ == '__main__':

    app.run()

jsonify 现象:用 chrome 浏览器访问页面, 可以 F12 打开控制台看到 Content-Type: application/json

注意:现在我们改为使用 Python 自带的 json 库 json.dumps 作为视图函数的直接返回值,代码如下:

from flask import Flask
from flask import jsonify
from flask import Response

app = Flask(__name__)

@app.route('/hello/<name>/<words>',methods=['GET'])
def hello(name,words):

    return json.dumps({'name':name,'words':words})


if __name__ == '__main__':

    app.run()

PS: 直接返回 json.dumps 的结果是可行的,因为 Flask 会判断并使用 make_response 方法自动构造出响应,只不过响应头各个字段是默认的。若要自定义响应字段,则可以使用 make_response 或 Response 自行构造响应。

json.dumps 现象:用chrome浏览器访问页面, 可以 F12 打开控制台看到 Content-Type: text/html;charset=utf-8

 

二、分析:

1. Content-Type有区别?

jsonify的作用实际上就是将我们传入的json形式数据序列化成为json字符串,作为响应的body,并且设置响应的Content-Type为application/json,构造出响应返回至客户端。jsonify的部分源码如下:

def jsonify(*args, **kwargs):

    if __debug__:
        _assert_have_json()

        return current_app.response_class(json.dumps(dict(*args, **kwargs), indent=None if request.is_xhr else 2), mimetype='application/json')

可以看出:

①、jsonify 实际上也是使用了 json.dumps 来序列化 json 形式的数据,作为响应正文返回。

②、indent 表示 json 格式化的缩进,若是 Ajax 请求则不缩进(因为一般Ajax数据没必要直接展示),否则缩进2格。

③、但想必从第一部分的实验结果我们已经看出来了,使用 jsonify 时响应的 Content-Type 字段值为 application/json,而使用 json.dumps 时该字段值为 text/html。

④、Content-Type 决定了接收数据的一方如何看待数据,如何处理数据,如果是 application/json,则可以直接当做 json 对象处理,若是text/html,则还要将文本对象转化为 json 对象再做处理。

2. 接受参数有区别

jsonify 可以接受和 python 中的 dict 构造器同样的参数,而 json.dumps 比 jsonify 可以多接受 list 类型和一些其他类型的参数。但我试了一下,形式为 key1=value1,[key2=value2,...] 这样的参数是不行的,会报出 “TypeError: dumps() takes exactly 1 argument (0 given)” 这一错误,而 jsonify 不会报错并能正常返回数据。

最后,我们可以使用flask中的make_response方法或者直接通过Response类,通过设置mimetype参数来达到和使用jsonify差不多的效果,但少写点代码何乐而不为呢?况且简洁一点更不容易出错,参数越多调试和维护就越麻烦。当然,使用哪个并不是绝对的,必要时要根据前端的数据处理方式来决定。

标签:__,name,Flask,jsonify,dumps,json
来源: https://blog.csdn.net/PY0312/article/details/100785462