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新手实现2048小游戏
Mar 31 Python
低版本中Python除法运算小技巧
Apr 05 Python
python实现自动更换ip的方法
May 05 Python
tensorflow实现简单的卷积神经网络
May 24 Python
python实现反转部分单向链表
Sep 27 Python
python reverse反转部分数组的实例
Dec 13 Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 Python
flask框架路由常用定义方式总结
Jul 23 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
用Python可视化新冠疫情数据
Jan 18 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
如何正确理解PHP的错误信息
2006/10/09 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
javascript 短路法代码精简
2009/08/20 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
采用call方式实现js继承
2014/05/20 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
企业宣传方案
2014/03/04 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
2014个人年度工作总结
2014/12/15 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
Python合并pdf文件的工具
2021/07/01 Python
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL