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入门之语句(if语句、while语句、for语句)
Jan 19 Python
Python 中的with关键字使用详解
Sep 11 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
你真的了解Python的random模块吗?
Dec 12 Python
python 图像平移和旋转的实例
Jan 10 Python
python range实例用法分享
Feb 06 Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 Python
Python+Appium实现自动抢微信红包
May 21 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 array的学习笔记
2012/05/10 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
C语言编程练习
2012/04/02 面试题
高中生的学习总结自我鉴定
2013/10/26 职场文书
办公室岗位职责
2014/02/12 职场文书
庆元旦活动总结
2014/07/09 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
雷锋的故事观后感
2015/06/10 职场文书
初中英语教学随笔
2015/08/15 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python