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之集合(set)
Sep 24 Python
python 文件操作删除某行的实例
Sep 04 Python
Python字符串格式化的方法(两种)
Sep 19 Python
Python遍历numpy数组的实例
Apr 04 Python
Python实现的爬虫刷回复功能示例
Jun 07 Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
DataFrame.to_excel多次写入不同Sheet的实例
Dec 02 Python
python十进制转二进制的详解
Feb 07 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
python 串行执行和并行执行实例
Apr 30 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 进度条实现代码
2009/03/10 PHP
php 无限级缓存的类的扩展
2009/03/16 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
浅析JavaScript事件和方法
2015/02/28 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
泛谈JS逻辑判断选择器 || &&
2019/05/24 Javascript
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
python的列表List求均值和中位数实例
2020/03/03 Python
python 瀑布线指标编写实例
2020/06/03 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
教师实习期自我鉴定
2013/10/06 职场文书
创业计划书如何吸引他人眼球
2014/01/10 职场文书
学校元旦晚会方案
2014/02/19 职场文书
品质主管岗位职责
2014/03/16 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
Python读写yaml文件
2022/03/20 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python
介绍一下28个JS常用数组方法
2022/05/06 Javascript