详谈在flask中使用jsonify和json.dumps的区别


Posted in Python onMarch 26, 2018

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):
 return jsonify({'name':name,'words':words})#也可以传入key=value形式的参数,如jsonify(name=name,words=words)
if __name__ == '__main__':
 app.run()

用chrome浏览器访问得到的页面如下图:

详谈在flask中使用jsonify和json.dumps的区别

现在我们改为使用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自行构造响应。用chrome访问的响应页面如下图。

详谈在flask中使用jsonify和json.dumps的区别

二、分析

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构造器同样的参数,如下图。

详谈在flask中使用jsonify和json.dumps的区别

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

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

更多关于jsonify的知识请参考官方文档:http://flask.pocoo.org/docs/0.12/api/#module-flask.json

更多关于json.dumps的知识参考官方文档:https://docs.python.org/2/library/json.html#module-json

以上这篇详谈在flask中使用jsonify和json.dumps的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
简单介绍Python中的JSON模块
Apr 08 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
Jan 18 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
用Python的绘图库(matplotlib)绘制小波能量谱
Apr 17 Python
Python超详细分步解析随机漫步
Mar 17 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 Python
python和flask中返回JSON数据的方法
Mar 26 #Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 #Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 #Python
Python实现找出数组中第2大数字的方法示例
Mar 26 #Python
Python实现将json文件中向量写入Excel的方法
Mar 26 #Python
Python元组拆包和具名元组解析实例详解
Mar 26 #Python
基于循环神经网络(RNN)实现影评情感分类
Mar 26 #Python
You might like
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
JS判断数组里是否有重复元素的方法小结
2019/05/21 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
寻找网站后台地址的python脚本
2014/09/01 Python
在Python中处理XML的教程
2015/04/29 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
详解python中init方法和随机数方法
2019/03/13 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
python3.7 sys模块的具体使用
2019/07/22 Python
在Python中os.fork()产生子进程的例子
2019/08/08 Python
wxPython实现文本框基础组件
2019/11/18 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
教师党员承诺书
2014/03/25 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
葬礼主持词
2015/07/02 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
基于Redis延迟队列的实现代码
2021/05/13 Redis
一文搞懂MySQL索引页结构
2022/02/28 MySQL
Python保存并浏览用户的历史记录
2022/04/29 Python