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多线程操作实例
Nov 21 Python
python if not in 多条件判断代码
Sep 21 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
详解pandas的外部数据导入与常用方法
May 01 Python
Python基础学习之时间转换函数用法详解
Jun 18 Python
pybind11和numpy进行交互的方法
Jul 04 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
Python学习之迭代器详解
Apr 01 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 Python
Python内置的数据类型及使用方法
Apr 13 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
php5新改动之短标记启用方法
2008/09/11 PHP
php smarty的预保留变量总结
2008/12/04 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
7个Javascript地图脚本整理
2009/10/20 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
vue项目使用微信公众号支付总结及遇到的坑
2018/10/23 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
Python 中Django安装和使用教程详解
2019/07/03 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
高考励志标语
2014/06/05 职场文书
2014年终工作总结范本
2014/12/15 职场文书
导游词之岳阳楼
2019/09/25 职场文书
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技