https://blog.csdn.net/angus_17/article/details/80455838

from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')
def root():t = {'a': 1,'b': 2,'c': [3, 4, 5]}return jsonify(t)if __name__ == '__main__':app.debug = Trueapp.run()

问题描述

在Flask中直接返回listdict是不行的,如

Python

 
  1. from flask import Flask

  2. app = Flask(__name__)

  3. @app.route('/')

  4. def root():

  5. t = {

  6. 'a': 1,

  7. 'b': 2,

  8. 'c': [3, 4, 5]

  9. }

  10. return t

  11. if __name__ == '__main__':

  12. app.debug = True

  13. app.run()

这样访问会直接提示

<code class="language-plain" style="font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13.6px;background:transparent;margin:0px;word-spacing:normal;line-height:inherit;border:0px;">TypeError: 'dict' object is not callable<span class="line-numbers-rows" style="font-size:13.6px;width:3em;letter-spacing:-1px;border-right:1px solid rgb(153,153,153);"><span></span></span></code>

其原因是Flask并不会将listdict默认转换为json格式。

解决方法

HTTP返回json格式数据主要有两个方面:

  1. 数据本身为json格式;
  2. Content-Type声明为json格式。

使用标准库json

比较常见的是采用标准库json进行格式转换:

Python

 
  1. from flask import Flask

  2. import json

  3. app = Flask(__name__)

  4. @app.route('/')

  5. def root():

  6. t = {

  7. 'a': 1,

  8. 'b': 2,

  9. 'c': [3, 4, 5]

  10. }

  11. return json.dumps(t)

  12. if __name__ == '__main__':

  13. app.debug = True

  14. app.run()

这样当访问时即能够正常得到json数据。但这么做有一个缺点,就是HTTP返回的Content-Type仍然是text/html,即HTTP认为内容是HTML。

声明Content-Type为json格式

在上面的解决方法上作一个加强,手动指定其Content-Typeapplication/json,通常采用的是修改Flask中的Response模块:

Python

 
  1. from flask import Flask, Response

  2. import json

  3. app = Flask(__name__)

  4. @app.route('/')

  5. def root():

  6. t = {

  7. 'a': 1,

  8. 'b': 2,

  9. 'c': [3, 4, 5]

  10. }

  11. return Response(json.dumps(t), mimetype='application/json')

  12. if __name__ == '__main__':

  13. app.debug = True

  14. app.run()

这样不仅HTTP返回的内容是json,而且返回的Content-Type也是application/json了。

使用Flask的jsonify模块

实际上flask已经为json准备了专门的模块:jsonifyjsonify不仅会将内容转换为json,而且也会修改Content-Typeapplication/json

Python

 
  1. from flask import Flask, jsonify

  2. app = Flask(__name__)

  3. @app.route('/')

  4. def root():

  5. t = {

  6. 'a': 1,

  7. 'b': 2,

  8. 'c': [3, 4, 5]

  9. }

  10. return jsonify(t)

  11. if __name__ == '__main__':

  12. app.debug = True

  13. app.run()

自定义Flask的Response,使用force_type()(2017.11.9更新)

对于某些特殊的情况,可能并不想每个返回json数据的方法都使用jsonify()包起来,那有没有什么“非侵入式”的方法实现jsonify()的功能呢?其实是有的,不过这个方法相对比较高端。

Flask返回的内容实际是Response对象,return语句的内容实际是交给Response处理后才输出由HTTP返回的;也就是说,之前直接返回dict报错TypeError: 'dict' object is not callable也是Response干的。那么只需要在Response处理如dict等“非法”数据是,告诉Response该怎么做就好了,这里就是用到了其force_type()方法了,所有不能处理的数据,都由force_type()方法尝试处理后,再决定报错或通过。直接看例子吧。

Python

 
  1. from flask import Flask, Response, jsonify

  2. class MyResponse(Response):

  3. @classmethod

  4. def force_type(cls, response, environ=None):

  5. if isinstance(response, (list, dict)):

  6. response = jsonify(response)

  7. return super(Response, cls).force_type(response, environ)

  8. app = Flask(__name__)

  9. app.response_class = MyResponse

  10. @app.route('/')

  11. def root():

  12. t = {

  13. 'a': 1,

  14. 'b': 2,

  15. 'c': [3, 4, 5]

  16. }

  17. return t

  18. if __name__ == '__main__':

  19. app.debug = True

  20. app.run()

或者还可以以继承的方式来实现自定义Response,如:

Python

 
  1. from flask import Flask, Response, jsonify

  2. class MyResponse(Response):

  3. @classmethod

  4. def force_type(cls, response, environ=None):

  5. if isinstance(response, (list, dict)):

  6. response = jsonify(response)

  7. return super(Response, cls).force_type(response, environ)

  8. class MyFlask(Flask):

  9. response_class = MyResponse

  10. app = MyFlask(__name__)

  11. @app.route('/')

  12. def root():

  13. t = {

  14. 'a': 1,

  15. 'b': 2,

  16. 'c': [3, 4, 5]

  17. }

  18. return t

  19. if __name__ == '__main__':

  20. app.debug = True

  21. app.run()

 

转载:https://www.polarxiong.com/archives/Flask%E8%AE%BE%E7%BD%AE%E8%BF%94%E5%9B%9Ejson%E6%A0%BC%E5%BC%8F.html

Flask设置返回json格式数据相关推荐

  1. Spring MVC--使用Jackson返回JSON格式数据

    使用Jackson返回JSON格式数据 index.jsp <%@ page language="java" contentType="text/html; cha ...

  2. (八): 查询结果直接返回Json格式数据

    Bee简单易用:单表操作.多表关联操作,可以不用写sql,极少语句就可以完成SQL操作:10分钟即可学会使用. Bee功能强大:复杂查询也支持向对象方式,分页查询性能更高,一级缓存即可支持个性化优化. ...

  3. 返回json格式数据乱码

    本文为博主原创,未经允许不得转载: 原本返回json格式数据的代码: @ResponseBody@RequestMapping(value = "getListByTime", m ...

  4. 使用jQuery发送POST,Ajax请求返回JSON格式数据

    问题: 使用jQuery POST提交数据到PHP文件, PHP返回的json_encode后的数组数据,但jQuery接收到的数据不能解析为JSON对象,而是字符串{"code" ...

  5. django mysql返回json_Django 1.8.11 查询数据库返回JSON格式数据

    Django 1.8.11 查询数据库返回JSON格式数据 和前端交互全部使用JSON,如何将数据库查询结果转换成JSON格式 环境 Win10 Python2.7 Django 1.8.11 返回多 ...

  6. ajax返回数据输出成表,javascript代码实例教程-ajax请求返回Json格式数据如何循环输出成table形式...

    小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过. 首先,Ajax请求数据,(用的是Jquery的Ajax) [javascript] $(function(){ ...

  7. java 返回 json格式_java 如何返回json格式数据,需要技巧

    今天上午给同事调了半个小时的程序,最后发现是在后台代码的java返回json格式的数据出了个错误.因此就想到了广大的初学者一开始学习jquery的时候可能会遇到这个问题.现在我就把我的给大家分享一下, ...

  8. Flask 学习-6. jsonify()返回JSON格式数据

    前言 JSON 格式的响应是常见的,用 Flask 写这样的 API 是很容易上手的.如果从视图 返回一个 dict ,那么它会被转换为一个 JSON 响应. 返回JSON 格式 如果从视图 返回一个 ...

  9. struts2控制器及拦截器返回JSON格式数据

    1.     JSON插件 想要使用json必定会用到jquery. 1.1        导入相关的Ajax-jar包-01资料中ajax文件中. commons-beanutils-1.8.0.j ...

最新文章

  1. 看似简单的问题 静态方法和实例化方法的区别
  2. KahanSummation算法
  3. 咖友:打个雷啊 | 今日头条VS腾讯新闻:让马化腾也坐不住的新闻资讯行业未来之争...
  4. 刘邦韩信java_刘邦为啥非要杀韩信,800多年后李世民给出了答案,原来如此
  5. nacos初探--作为配置中心
  6. 计算机控制pid控制实验,计算机控制实验三数字PID调节器算法的研究
  7. Python中lambda表达式的语法与应用
  8. C1. Simple Polygon Embedding(计算几何)
  9. java工具类解压缩zip和rar
  10. 中国电信中国电信物联网开放平台-连接管理子系统 http返回为空
  11. Smartbi的安装部署
  12. html中竖线怎么写,网页中竖线的几种做法
  13. 做转子力学分析,你选APDL还是Workbench仿真?
  14. CF 115B. Lawnmower
  15. percona mysql备份与恢复(一)
  16. 生产者和消费者模型介绍
  17. 经典系列——鸡尾酒排序
  18. 杜云飞java_Akka实战:快速构建高可用分布式应用 杜云飞著 PDF下载
  19. 可能是知乎里最浅显易懂的激光测距技术讲解:什么是点激光,线激光,面激光。它们在扫地机器人上是如何应用的。
  20. Vue CLI3 移动端适配 【px2rem 或 postcss-plugin-px2rem】

热门文章

  1. C# 设置当前程序调用的dll文件以及其他文件的寻址路径
  2. 一个怎样得到treeView值的小例子
  3. 数据迁移测试_自动化数据迁移测试
  4. virtualbox php mac,详解mac下通过docker搭建LEMP环境
  5. SiameseRPN详解
  6. 678. 有效的括号字符串
  7. 1736. 替换隐藏数字得到的最晚时间
  8. leetcode 188. 买卖股票的最佳时机 IV(dp)
  9. 如何在React Native和Firebase中设置Google登录
  10. 如何将您的#100DaysOfCode登录转换为视觉体验