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中操作文件之read()方法的使用教程
May 24 Python
Python的CGIHTTPServer交互实现详解
Feb 08 Python
python3 读写文件换行符的方法
Apr 09 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
Django restframework 源码分析之认证详解
Feb 22 Python
python批量解压zip文件的方法
Aug 20 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
python自动从arxiv下载paper的示例代码
Dec 05 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
smarty简单应用实例
2015/11/03 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
使用PHP开发留言板功能
2019/11/19 PHP
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python3实现转换Image图片格式
2018/06/21 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
python实现根据文件格式分类
2019/10/31 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
老海军美国官网:Old Navy
2016/09/05 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
毕业生个人求职信范例分享
2013/12/17 职场文书
坚定理想信念心得体会
2014/03/11 职场文书
销售员试用期自我评价
2014/09/15 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
python如何在word中存储本地图片
2021/04/07 Python
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python