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的id()函数介绍
Feb 10 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
Python 查看文件的编码格式方法
Dec 21 Python
基于DataFrame改变列类型的方法
Jul 25 Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 Python
python opencv 图像拼接的实现方法
Jun 27 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
Python游戏开发实例之graphics实现AI五子棋
Nov 01 Python
python周期任务调度工具Schedule使用详解
Nov 23 Python
python使用torch随机初始化参数
Mar 22 Python
基于Python实现射击小游戏的制作
Apr 06 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
Python脚本实现代码行数统计代码分享
2015/03/10 Python
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
深入理解Django-Signals信号量
2019/02/19 Python
Pandas中resample方法详解
2019/07/02 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
Java模拟试题
2014/11/10 面试题
计算机专业自荐信
2013/10/14 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
商超业务员岗位职责
2015/02/13 职场文书
2015年大学生工作总结
2015/04/21 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
感恩教育观后感
2015/06/17 职场文书
python实现网络五子棋
2021/04/11 Python