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检测远程服务器tcp端口的方法
Mar 14 Python
Python下载懒人图库JavaScript特效
May 28 Python
Python自定义主从分布式架构实例分析
Sep 19 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
学习Python selenium自动化网页抓取器
Jan 20 Python
python队列queue模块详解
Apr 27 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
python中web框架的自定义创建
Sep 08 Python
python线程定时器Timer实现原理解析
Nov 30 Python
python名片管理系统开发
Jun 18 Python
pytorch损失反向传播后梯度为none的问题
May 12 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
PHP5 字符串处理函数大全
2010/03/23 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
php实现telnet功能示例
2014/04/08 PHP
php获取根域名方法汇总
2014/10/28 PHP
php开发工具有哪五款
2015/11/09 PHP
PHP连接MySQL进行增、删、改、查操作
2017/02/19 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
js处理包含中文的字符串实例
2017/10/11 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
Python元组知识点总结
2019/02/18 Python
python如何实现代码检查
2019/06/28 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
Django框架models使用group by详解
2020/03/11 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Python项目跨域问题解决方案
2020/06/22 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
销售工作人员的自我评价分享
2013/11/10 职场文书
学生请假条格式
2014/04/11 职场文书
初一学生评语大全
2014/04/24 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书