详谈在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实现的远程文件自动打包并下载功能示例
Jul 12 Python
通过python改变图片特定区域的颜色详解
Jul 15 Python
Python List列表对象内置方法实例详解
Oct 22 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
Python遍历字典方式就实例详解
Dec 28 Python
关于tf.nn.dynamic_rnn返回值详解
Jan 20 Python
Django分组聚合查询实例分享
Apr 29 Python
学python爬虫能做什么
Jul 29 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 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
PHP脚本的10个技巧(1)
2006/10/09 PHP
生成静态页面的php函数,php爱好者站推荐
2007/03/19 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
javascript document.images实例
2008/05/27 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
javascript实现表单验证
2016/01/29 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
基于Python中的yield表达式介绍
2019/11/19 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
python编写实现抽奖器
2020/09/10 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
工作交流会欢迎词
2014/01/12 职场文书
公司请假条范文
2014/04/11 职场文书
环保倡议书500字
2014/05/15 职场文书
全运会口号
2014/06/20 职场文书
在校学生证明格式
2015/06/24 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
Go 内联优化让程序员爱不释手
2022/06/21 Golang