-
python爬虫之flask中使用jsonify和json.dumps的区别
试听地址 https://www.xin3721.com/eschool/pythonxin3721/
flask提供了jsonify函数供用户处理返回的序列化json数据,而python自带的json库中也有dumps方法可以序列化json对象,那么在flask的视图函数中return它们会有什么不同之处呢?
想必开始很多人和我一样搞不清楚,只知道既然框架提供了方法就用,肯定不会错。
但作为开发人员,我们需要弄清楚开发过程中各种实现方式的特点和区别,这样在我们面对不同的需求时才能做出相对合理的选择,而不是千篇一律地使用自己熟悉的。下面我就jsonify和json.dumps的区别这一问题简单探讨一下。
一、实验
python的flask框架为用户提供了直接返回包含json格式数据响应的方法,即jsonify,在开发中会经常用到。如下一段简单的flask后端代码,服务端视图函数根据请求参数返回json格式的数据到客户端。
1
2
3
4
5
6
7
8
9
|
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 jsonify({ 'name' :name, 'words' :words}) #也可以传入key=value形式的参数,如jsonify(name=name,words=words) if __name__ = = '__main__' : app.run() |
用chrome浏览器访问页面, 可以打开控制台看到Content-Type: application/json
现在我们改为使用python自带的json库json.dumps作为视图函数的直接返回值,代码如下:
1
2
3
4
5
6
7
8
9
|
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自行构造响应。
用chrome浏览器访问页面, 可以打开控制台看到Content-Type: text/html;charset=utf-8
二、分析
1.Content-Type有区别
jsonify的作用实际上就是将我们传入的json形式数据序列化成为json字符串,作为响应的body,并且设置响应的Content-Type为application/json,构造出响应返回至客户端。jsonify的部分源码如下:
1
2
3
4
|
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' ) |