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进程类subprocess的一些操作方法例子
Nov 22 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
Python实现处理管道的方法
Jun 04 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
python使用PIL剪切和拼接图片
Mar 23 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
利用Pycharm连接服务器的全过程记录
Jul 01 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自定义大小验证码的方法详解
2013/06/07 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
wxPython实现分隔窗口
2019/11/19 Python
Python 如何创建一个线程池
2020/07/28 Python
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
东方红海科技面试题软件测试方面
2012/02/08 面试题
骨干教师培训制度
2014/01/13 职场文书
《中国的气候》教学反思
2014/02/23 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
工商行政处罚决定书
2015/06/24 职场文书
社区宣传标语口号
2015/12/26 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
总结一些Java常用的加密算法
2021/06/11 Java/Android
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫