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

在flask中使用jsonify和json.dumps的区别flask提供了jsonify函数供用户处理返回的序列化json数据,而python自带的json库中也有dumps方法可以序列化json对象,那么在flask的视图函数中return它们会有什么不同之处呢?想必开始很多人和我一样搞不清楚,只知道既然框架提供了方法就用,肯定不会错。但作为开发人员,我们需要弄清楚开发过程中各种实现方式的特点和区别,这样在我们面对不同的需求时才能做出相对合理的选择,而

大家好,又见面了,我是你们的朋友全栈君。

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的区别

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

在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的区别

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

在flask中使用jsonify和json.dumps的区别在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的区别在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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142214.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • VS2017专业版使用最新版Qt5.9.2教程(最新教材)

    VS2017专业版使用最新版Qt5.9.2教程(最新教材)VS2017专业版使用最新版Qt5.9.2教程(最新教材)目录VS2017专业版使用最新版Qt5.9.2教程(最新教材)运行环境:1.安装Qt5.9.22.安装Qt5.9与VS2017之间的插件:3.配置QtVSTool的环境.4.设置创建的Qt的项目的属性,对包含目录、引用目录、库目录进行环境配置5.Qt的环境变量配置6.开心,开心,开心的样子,运行成功…

  • 大疆网上测评题库_大疆笔试题

    大疆网上测评题库_大疆笔试题大疆笔试的体验很好,没有很为难应聘者,还有着自己鲜明的特点,我认为值得一说,特此写笔经记录一下,顺便攒攒RP,第一次笔经就献给大疆啦~笔试网站是大疆自己搭建的(UI设计炒鸡好看!!!),我猜题目也是大疆HR团队自己出的。从这点来看,大疆对人才的把控很严格,必须是自己经手选出来的人。整套笔试题目共有90道题,给了1.5个小时完成,题型包括态度行为题、行业知识题、工作情景题,以及略有升级的行测题。其中…

  • windows下常见php集成环境安装包介绍(updated)

    windows下常见php集成环境安装包介绍(updated)windows下常见php集成环境安装包介绍(updated)September4,2010 |作者:猪肉有毒   WAMP是指在Windows服务器上使用Apache、MySQL和PHP的集成安装环境,可以快速安装配置Web服务器,一般说来,大家都习惯于将Apache、MySQL、PHP架设在Linux系统下,但是,不可否认的是Windows也有其优点,就是易用,

  • [大整数乘法] java代码实现

    [大整数乘法] java代码实现

  • 谷歌地球手机版2021登不上服务器_谷歌地球连不上服务器是怎么回事

    谷歌地球手机版2021登不上服务器_谷歌地球连不上服务器是怎么回事1、安装运行谷歌地球专业版(GoogleEarthProv7.3)。2、安装运行国家法律允许使用的VPN软件。3、首次运行谷歌地球,需要点击“文件一登录服务器”,如果软件界面显示黑屏。4、选择“帮助一启动修复工具”。5、先关闭谷歌地球软件,保留“修复Google地球界面”不要关闭。6、选择“恢复默认设置”,窗口不要关闭。7、在次运行谷歌地球软件,点击“文件一一登录服务器”,稍等几秒钟熟悉的地球界面出来后,谷歌地球软件即可正常使用。如果谷歌地球软件无法运行,请在wi

  • 数组 函数_从零开始的基础篇

    数组 函数_从零开始的基础篇一、数组操作的基本函数数组的键名和值array_values($arr);获得数组的值array_keys($arr);获得数组的键名array_flip($arr);数组中的值与键名互换(如

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号