Django中使用Json返回数据的实现方法


Posted in Python onJune 03, 2020

在一个网站在,大量数据与前端交互,JSON是最好的传递数据方式了。

在Django中,使用JSON传输数据,有两种方式,一种是使用Python的JSON包,一种是使用Django的JsonResponse

方法一:使用Python的JSON包

from django.shortcuts import HttpResponse

import json


def testjson(request):
  data={
    'patient_name': '张三',
    'age': '25',
    'patient_id': '19000347',
    '诊断': '上呼吸道感染',
  }
  return HttpResponse(json.dumps(data))

我们暂且把data看成是从数据库取出来的数据,使用浏览器访问一下testjson

Django中使用Json返回数据的实现方法

咦,怎么是乱码了?有中文的都是乱码了?

不着急,这不是乱码,这是中文在内存中的二进制表现形式而已,使用JSON的转换工具可以看到中文的。

我们看一下Response Headers响应头,其中的Content-Type是text/html,我明明传的是JSON啊,怎么会变成字符串类型了?这是因为我们没有告诉浏览器,我们要传一个JSON数据,那么,怎么告诉浏览器呢?

HttpResponse是继承HttpResponseBase的,我们可以告诉浏览器,我要传application/json数据。我们稍微改一下content的值,看看会变成什么?

def testjson(request):
  data={
    'patient_name': '张三',
    'age': '25',
    'patient_id': '19000347',
    '诊断': '上呼吸道感染',
  }
  return HttpResponse(json.dumps(data), content_type='application/json')

再访问网页:

Django中使用Json返回数据的实现方法

Django中使用Json返回数据的实现方法

这下好了,是传输JSON了,在Preview中可以正常显示出来了。

方法二:使用JsonResponse进行传输。

def testjson(request):
  data={
    'patient_name': '张三',
    'age': '25',
    'patient_id': '19000347',
    '诊断': '上呼吸道感染',
  }
  return JsonResponse(data)

访问网页:

Django中使用Json返回数据的实现方法

Django中使用Json返回数据的实现方法

嗯,一切正常。

看一下JsonResponse的源码:

class JsonResponse(HttpResponse):
  """
  An HTTP response class that consumes data to be serialized to JSON.

  :param data: Data to be dumped into json. By default only ``dict`` objects
   are allowed to be passed due to a security flaw before EcmaScript 5. See
   the ``safe`` parameter for more information.
  :param encoder: Should be a json encoder class. Defaults to
   ``django.core.serializers.json.DjangoJSONEncoder``.
  :param safe: Controls if only ``dict`` objects may be serialized. Defaults
   to ``True``.
  :param json_dumps_params: A dictionary of kwargs passed to json.dumps().
  """

  def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
         json_dumps_params=None, **kwargs):
    if safe and not isinstance(data, dict):
      raise TypeError(
        'In order to allow non-dict objects to be serialized set the '
        'safe parameter to False.'
      )
    if json_dumps_params is None:
      json_dumps_params = {}
    kwargs.setdefault('content_type', 'application/json')
    data = json.dumps(data, cls=encoder, **json_dumps_params)
    super().__init__(content=data, **kwargs)

其内部也是通过json.dumps来把数据转换为JSON的,其还可以转换为list类型。我们再来改一下testjson

def testjson(request):
 listdata = ["张三", "25", "19000347", "上呼吸道感染"]
 return JsonResponse(listdata)

程序报错了

Django中使用Json返回数据的实现方法

报错为:In order to allow non-dict objects to be serialized set the safe parameter to False,它的意思是转换为一个非字典的类型时,safe参数要设置为False,还记得上面JsonResponse的原码吗?其中就有

Django中使用Json返回数据的实现方法

代码修改为:

def testjson(request):
  listdata = ["张三", "25", "19000347", "上呼吸道感染"]
  return JsonResponse(listdata, safe=False)

Django中使用Json返回数据的实现方法

Django中使用Json返回数据的实现方法

嗯,这下正常了。

这有什么用呢?有时我们从数据库取出来的数据,很多是列表类型的,特别是用cx_Oracle包在Oracle数据库取出来的数据,其不支持直接字典的输出,输出就是一个list,这时我们使用JsonResponse(data, safe=False)就可以直接输换为Json,发送到前端了。

到此这篇关于Django中使用Json返回数据的实现方法的文章就介绍到这了,更多相关Django Json返回数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python字符串对象的实现
Dec 24 Python
Python实现购物程序思路及代码
Jul 24 Python
Python学习笔记之if语句的使用示例
Oct 23 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
Jan 04 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
python使用递归的方式建立二叉树
Jul 03 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
基于python爬取有道翻译过程图解
Mar 31 Python
关于Python解包知识点总结
May 05 Python
浅析Python 序列化与反序列化
Aug 05 Python
详解java调用python的几种用法(看这篇就够了)
Dec 10 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 #Python
基于Python绘制美观动态圆环图、饼图
Jun 03 #Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 #Python
浅谈python opencv对图像颜色通道进行加减操作溢出
Jun 03 #Python
python golang中grpc 使用示例代码详解
Jun 03 #Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 #Python
QML用PathView实现轮播图
Jun 03 #Python
You might like
业余方法DIY电子管FM收音机
2021/03/02 无线电
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
Document对象内容集合(比较全)
2010/09/06 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
关于Python元祖,列表,字典,集合的比较
2017/01/06 Python
python实现顺时针打印矩阵
2019/03/02 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
医科大学毕业生自荐信
2014/02/03 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
2015年电教工作总结
2015/05/26 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
MySQL数据库之存储过程 procedure
2022/06/16 MySQL
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript