zoukankan      html  css  js  c++  java
  • flask中使用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  
     5  
     6 app = Flask(__name__)
     7  
     8  
     9 @app.route('/hello/<name>/<words>',methods=['GET'])
    10 def hello(name,words):
    11     return jsonify({'name':name,'words':words})#也可以传入key=value形式的参数,如jsonify(name=name,words=words)
    12  
    13  
    14 if __name__ == '__main__':
    15     app.run()

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

     

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

     1 from flask import Flask
     2 from flask import jsonify
     3 from flask import Response
     4  
     5  
     6 app = Flask(__name__)
     7  
     8  
     9 @app.route('/hello/<name>/<words>',methods=['GET'])
    10 def hello(name,words):
    11     return json.dumps({'name':name,'words':words})
    12  
    13  
    14 if __name__ == '__main__':
    15     app.run()

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

     

    二、分析

    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')

    2.接受参数有区别

    jsonify可以接受和python中的dict构造器同样的参数,如下图。

     

    而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

  • 相关阅读:
    django 项目需要注意的一些点
    VUE之路
    Oracle 表格碎片的查看方法
    RHEL 6.x or 7.x 使用分区绑定ASM 磁盘的方法
    RMAN 修复主库 nologging 操作导致物理备库的坏块
    Oracle 数据库19c 回退降级到 11.2.0.4 方案
    如何评估oracle 数据库rman全备和增量备份大小
    在将Oracle GI和DB升级到19c或降级到以前的版本之前需要应用的补丁 (Doc ID 2668071.1)
    Oracle 数据库坏块处理
    opatch auto 安装11.2.0.4.20190115 PSU遇到 OUI-67133: Execution of PRE script failed,with returen value 1 报错
  • 原文地址:https://www.cnblogs.com/lmh001/p/9963061.html
Copyright © 2011-2022 走看看