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中非常实用的一些功能和函数分享
Feb 14 Python
Python调用微信公众平台接口操作示例
Jul 08 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
Python 16进制与中文相互转换的实现方法
Jul 09 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 Python
Django中create和save方法的不同
Aug 13 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
Jun 17 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
python 基于opencv操作摄像头
Dec 24 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动态生成版权所有信息的方法
2015/03/24 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
javascript 函数速查表
2010/02/07 Javascript
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
Python实现的RSS阅读器实例
2015/07/25 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
python可迭代对象去重实例
2020/05/15 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
介绍一下gcc特性
2012/01/20 面试题
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
社会实践心得体会
2014/01/03 职场文书
领导党性分析材料
2014/02/15 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
立志成才演讲稿
2014/09/04 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
销售合作意向书范本
2015/05/08 职场文书
后天观后感
2015/06/08 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang