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

  • 相关阅读:
    python安装cnstd卡住
    _、__、__xx__之间的差别
    Celery模块使用
    同一主机,开启多个不同端口的redis进程
    php配置变更记录
    Linux安装Nodejs
    ElasticSearch中term和match探索
    Centos安装elasticsearch,php连接使用
    centos8自定义目录安装php7.3
    centos8自定义目录安装nginx
  • 原文地址:https://www.cnblogs.com/lmh001/p/9963061.html
Copyright © 2011-2022 走看看