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解析html开发库pyquery使用方法
Feb 07 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
numpy中矩阵合并的实例
Jun 15 Python
python斐波那契数列的计算方法
Sep 27 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 Python
Python作用域与名字空间原理详解
Mar 21 Python
python制作微博图片爬取工具
Jan 16 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 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中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
yii操作cookie实例简介
2014/07/09 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
深入理解node.js http模块
2018/01/24 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
python实现的一个p2p文件传输实例
2014/06/04 Python
Python中asyncore的用法实例
2014/09/29 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
对python 自定义协议的方法详解
2019/02/13 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
详解python tcp编程
2020/08/24 Python
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
2014年安全员工作总结
2014/11/13 职场文书
大学军训决心书
2015/02/05 职场文书
新学期开学寄语2016
2015/12/04 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android