jsonify

jsonifyflask提供了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格式的数据到客户端。

  1. from flask
    import Flask

  2. from flask
    import jsonify

  3. from flask
    import Response

  4. app = Flask(__name__)

  5. @app.route(‘/hello/<name>/<words>’,methods=[‘GET’])

  6. def hello(name,words):

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

  8. if __name__ ==
    ‘__main__’:

  9. app.run()


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

jsonify

jsonify

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

  1. from flask
    import Flask

  2. from flask
    import jsonify

  3. from flask
    import Response

  4. app = Flask(__name__)

  5. @app.route(‘/hello/<name>/<words>’,methods=[‘GET’])

  6. def hello(name,words):

  7. return json.dumps({
    ‘name’:name,
    ‘words’:words})

  8. if __name__ ==
    ‘__main__’:

  9. app.run()




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

jsonify

jsonify

二、分析

1.Content-Type有区别

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

  1. def jsonify(*args, **kwargs):

  2. if __debug__:

  3. _assert_have_json()

  4. return current_app.response_class(json.dumps(dict(*args, **kwargs),

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

jsonify

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

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

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142116.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月10日 上午8:00
下一篇 2022年5月10日 上午8:00


相关推荐

  • 延时1s的延时子程序_用一个时间常数为0.35秒的一阶装置

    延时1s的延时子程序_用一个时间常数为0.35秒的一阶装置文档介绍:目录第一部分设计任务及方案1、设计题目及要求2、设计方案分析论证第二部分方案各模块分析1、被控对象分析2、测量元件热电阻及前置放大电路3、A/D转换器4、控制器(单片机)5、光隔驱动器第三部分数字控制器D(Z)的设计1、数字控制器D(Z)2、程序流程图设计第四部分可靠性和抗干扰性的分析第五部分心得体会设计任务及方案1.1设计题目及要求1、针对一个具有大纯时延时间的一阶惯性环节()温度控…

    2026年4月14日
    10
  • GRPC Connection Backoff Protocol「建议收藏」

    GRPC Connection Backoff Protocol「建议收藏」GRPCConnectionBackoffProtocol当我们向一个失败的后端进行连接时,通常不希望立即重试(为了避免请求flooding网络或者服务器),而是去做一些某种形式的指数backoff。我们有几个参数:INITINAL_BACKOFF(第一次失败后的重试需要等待多长时间)MULTIPLIER(在一次失败的重试后,backoff的乘回因子)JITTER(随机backoffs的程度)MAX_BACKOFF(backoff的上界)MIN_CONNECT_TIMEOUT(我们

    2022年6月17日
    35
  • spring cloud熔断器原理_a股熔断机制是什么时候

    spring cloud熔断器原理_a股熔断机制是什么时候1.熔断机制介绍在介绍熔断机制之前,我们需要了解微服务的雪崩效应。在微服务架构中,微服务是完成一个单一的业务功能,这样做的好处是可以做到解耦,每个微服务可以独立演进。但是,一个应用可能会有多个微服务组成,微服务之间的数据交互通过远程过程调用完成。这就带来一个问题,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时…

    2025年6月13日
    5
  • map和stack_创建一个MEAN Stack Google Map App(第一部分)

    map和stack_创建一个MEAN Stack Google Map App(第一部分)map和stack介绍(Introduction)”MEANAppswithGoogleMaps”(Atonguetwistertobetrue).“带有GoogleMaps的MEAN应用”(确实是绕口令)。Andyet,whetheryou’rebuildinganapplicationtovisualizebikelanesinyou…

    2022年5月29日
    46
  • 大数据平台设计思路

    大数据平台设计思路一 什么是大数据平台一般情况下 大数据平台指的是使用了 Hadoop Spark Storm Flink Blink 等这些分布式 实时或者离线计算框架 并在上面运行各种计算任务的平台 建设大

    2026年3月18日
    1
  • 笔记本电脑用久了卡顿解决方法视频_win7严重卡顿

    笔记本电脑用久了卡顿解决方法视频_win7严重卡顿第一步:点击我的电脑或者此电脑选中C盘(最好是每哥盘都做下面的操作)右键点击然后选中属性如图所示:点击磁盘清理然后继续选择其中需要清理的,其实都可以清理。第二步:然后点击选择工具,选择优化如图所示第三步:选择其中的一个盘如有分析就先点击分析,然后点击优化如图所示:第四步:桌面的东西能清理就都清理掉,桌面最好就只保留一两个东西。第五步:删除C盘下面中Web里面的所有东西,是删除Web里面的所有东西,不是Web文件夹,还有删除Temp文件夹下面的所有东西,不要删除Temp

    2025年10月31日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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