在一个网站在,大量数据与前端交互,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
咦,怎么是乱码了?有中文的都是乱码了?
不着急,这不是乱码,这是中文在内存中的二进制表现形式而已,使用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')
再访问网页:
这下好了,是传输JSON了,在Preview中可以正常显示出来了。
方法二:使用JsonResponse进行传输。
def testjson(request): data={ 'patient_name': '张三', 'age': '25', 'patient_id': '19000347', '诊断': '上呼吸道感染', } return JsonResponse(data)
访问网页:
嗯,一切正常。
看一下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)
程序报错了
报错为:In order to allow non-dict objects to be serialized set the safe parameter to False,它的意思是转换为一个非字典的类型时,safe参数要设置为False,还记得上面JsonResponse的原码吗?其中就有
代码修改为:
def testjson(request): listdata = ["张三", "25", "19000347", "上呼吸道感染"] return JsonResponse(listdata, safe=False)
嗯,这下正常了。
这有什么用呢?有时我们从数据库取出来的数据,很多是列表类型的,特别是用cx_Oracle包在Oracle数据库取出来的数据,其不支持直接字典的输出,输出就是一个list,这时我们使用JsonResponse(data, safe=False)就可以直接输换为Json,发送到前端了。
到此这篇关于Django中使用Json返回数据的实现方法的文章就介绍到这了,更多相关Django Json返回数据内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍django实现HttpResponse返回json数据为中文,包括了django实现HttpResponse返回json数据为中文的使用技巧和注意事项,需要的朋友参考一下 Python3读取写入json的中文乱码问题 之前我用django一般用JsonResponse来返回json数据格式 但是发现返回中文的时候会乱码 这种方式返回简单,但是中文会乱码 现在改成用HttpRespo
本文向大家介绍使用Django的JsonResponse返回数据的实现,包括了使用Django的JsonResponse返回数据的实现的使用技巧和注意事项,需要的朋友参考一下 urls.py 在views.py中创建show_view函数 到此这篇关于使用Django的JsonResponse返回数据的实现的文章就介绍到这了,更多相关Django JsonResponse内容请搜索呐喊教程以前的文
本文向大家介绍Django返回json数据用法示例,包括了Django返回json数据用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Django返回json数据用法。分享给大家供大家参考,具体如下: 1、前端。jQuery发送GET请求,并解析json数据。getJSON方法可参考这里。 2、后端。Django接收GET请求并返回json数据。 更多关于Python相关内容感兴趣
本文向大家介绍使用post方法实现json往返传输数据的方法,包括了使用post方法实现json往返传输数据的方法的使用技巧和注意事项,需要的朋友参考一下 问题所在: 当我们想让应用层和http之间的所有接口都采用json,这样,客户端代码就可以纯碎用javascript的对象来编写,服务器打啊也可以纯粹的用Java的对象来编写。 我们使用的是post请求的方法,有些不同于get的方法! 客户端h
本文向大家介绍Python的Django框架实现数据库查询(不返回QuerySet的方法),包括了Python的Django框架实现数据库查询(不返回QuerySet的方法)的使用技巧和注意事项,需要的朋友参考一下 一、创建模型类: 执行以下命令,进行数据库的迁移: python manage.py makemigrations app_name[应用的名称] python manage.py m
本文向大家介绍thinkPHP5实现的查询数据库并返回json数据实例,包括了thinkPHP5实现的查询数据库并返回json数据实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了thinkPHP5实现的查询数据库并返回json数据。分享给大家供大家参考,具体如下: TP5 实现查询数据库返回json数据(返回json数据函数实例) 返回结果: 一、把格式化json函数写到公共文件com