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程序语言快速上手教程
Jul 18 Python
一个计算身份证号码校验位的Python小程序
Aug 15 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
Jul 06 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
python BeautifulSoup库的安装与使用
Dec 17 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 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
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
制作特殊字的脚本
2006/06/26 Javascript
学习js所必须要知道的一些
2007/03/07 Javascript
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
Javascript学习笔记2 函数
2010/01/11 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
Django中Forms的使用代码解析
2018/02/10 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
python中有关时间日期格式转换问题
2019/12/25 Python
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
微信营销策划方案
2014/02/24 职场文书
企业年会主持词
2014/03/27 职场文书
买房协议书
2014/04/11 职场文书
少先队活动总结
2014/08/29 职场文书
解约证明模板
2015/06/19 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书