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复制目录结构脚本代码分享
Mar 06 Python
Python下使用Psyco模块优化运行速度
Apr 05 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
Python中如何导入类示例详解
Apr 17 Python
python 判断文件还是文件夹的简单实例
Jun 10 Python
python替换字符串中的子串图文步骤
Jun 19 Python
教你一步步利用python实现贪吃蛇游戏
Jun 27 Python
python 实现矩阵填充0的例子
Nov 29 Python
python变量的作用域是什么
May 26 Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 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
mysql 搜索之简单应用
2007/04/27 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
js数组操作学习总结
2013/11/04 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
NodeJs基本语法和类型
2015/02/13 NodeJs
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
Python中的Numpy入门教程
2014/04/26 Python
python两种遍历字典(dict)的方法比较
2014/05/29 Python
PyMongo安装使用笔记
2015/04/27 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
python读取Excel表格文件的方法
2019/09/02 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
Python模块相关知识点小结
2020/03/09 Python
Java面试题及答案
2012/09/08 面试题
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
工商局个人工作总结
2015/03/03 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书