Django 返回json數(shù)據(jù)的實(shí)現(xiàn)示例
在一個(gè)網(wǎng)站,大量數(shù)據(jù)的前后端交互,JSON是最好的傳遞數(shù)據(jù)方式了。
在Django中,使用JSON傳輸數(shù)據(jù),有兩種方式,一種是使用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看成是從數(shù)據(jù)庫(kù)取出來(lái)的數(shù)據(jù),使用瀏覽器訪問(wèn)一下testjson

這不是亂碼,這是中文在內(nèi)存中的二進(jìn)制表現(xiàn)形式而已,使用JSON的轉(zhuǎn)換工具可以看到中文。
我們看一下Response Headers響應(yīng)頭,其中的Content-Type是text/html,我明明傳的是JSON啊,怎么會(huì)變成字符串類(lèi)型了?這是因?yàn)槲覀儧](méi)有告訴瀏覽器,我們要傳一個(gè)JSON數(shù)據(jù),那么,怎么告訴瀏覽器呢?
def testjson(request):
data={
'patient_name': '張三',
'age': '25',
'patient_id': '19000347',
'診斷': '上呼吸道感染',
}
return HttpResponse(json.dumps(data), content_type='application/json')
再訪問(wèn)網(wǎng)頁(yè):


現(xiàn)在是傳輸JSON了,在Preview中可以正常顯示出來(lái)。
方法二:使用JsonResponse進(jìn)行傳輸
def testjson(request):
data={
'patient_name': '張三',
'age': '25',
'patient_id': '19000347',
'診斷': '上呼吸道感染',
}
return JsonResponse(data)
訪問(wèn)網(wǎng)頁(yè):



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)
其內(nèi)部也是通過(guò)json.dumps來(lái)把數(shù)據(jù)轉(zhuǎn)換為JSON的,其還可以轉(zhuǎn)換為list類(lèi)型。我們?cè)賮?lái)改一下testjson
def testjson(request): listdata = ["張三", "25", "19000347", "上呼吸道感染"] return JsonResponse(listdata)
程序報(bào)錯(cuò)了

報(bào)錯(cuò)為:In order to allow non-dict objects to be serialized set the safe parameter to False,它的意思是轉(zhuǎn)換為一個(gè)非字典的類(lèi)型時(shí),safe參數(shù)要設(shè)置為False,還記得上面JsonResponse的原碼嗎?其中就有

代碼修改為:
def testjson(request): listdata = ["張三", "25", "19000347", "上呼吸道感染"] return JsonResponse(listdata, safe=False)



這有什么用
有時(shí)我們從數(shù)據(jù)庫(kù)取出來(lái)的數(shù)據(jù),很多是列表類(lèi)型的,特別是用cx_Oracle包在Oracle數(shù)據(jù)庫(kù)取出來(lái)的數(shù)據(jù),其不支持直接字典的輸出,輸出就是一個(gè)list,這時(shí)我們使用JsonResponse(data, safe=False)就可以直接輸換為Json,發(fā)送到前端了。
到此這篇關(guān)于Django 返回json數(shù)據(jù)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Django返回json 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django admin 實(shí)現(xiàn)search_fields精確查詢實(shí)例
這篇文章主要介紹了Django admin 實(shí)現(xiàn)search_fields精確查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
python繪制BA無(wú)標(biāo)度網(wǎng)絡(luò)示例代碼
今天小編就為大家分享一篇python繪制BA無(wú)標(biāo)度網(wǎng)絡(luò)示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python滲透測(cè)試入門(mén)之Scapy庫(kù)的使用詳解
Scapy?是一個(gè)用來(lái)解析底層網(wǎng)絡(luò)數(shù)據(jù)包的Python模塊和交互式程序,該程序?qū)Φ讓影幚磉M(jìn)行了抽象打包,使得對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的處理非常簡(jiǎn)便。本文就來(lái)聊聊它的具體使用,希望對(duì)大家有所幫助2023-03-03
Python Pandas中根據(jù)列的值選取多行數(shù)據(jù)
這篇文章主要介紹了Python Pandas中根據(jù)列的值選取多行數(shù)據(jù)的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì) ,需要的朋友可以參考下2019-07-07
Python處理時(shí)間日期坐標(biāo)軸過(guò)程詳解
這篇文章主要介紹了Python處理時(shí)間日期坐標(biāo)軸過(guò)程詳解,當(dāng)日期數(shù)據(jù)作為圖表的坐標(biāo)軸時(shí)通常需要特殊處理,應(yīng)為日期字符串比較長(zhǎng),容易產(chǎn)生重疊現(xiàn)象,需要的朋友可以參考下2019-06-06
Python2 與Python3的版本區(qū)別實(shí)例分析
這篇文章主要介紹了Python2 與Python3的版本區(qū)別,結(jié)合實(shí)例形式分析了Python2 與Python3的版本使用過(guò)程中的各種常見(jiàn)區(qū)別、用法與注意事項(xiàng),需要的朋友可以參考下2020-03-03
Python基于回溯法子集樹(shù)模板解決全排列問(wèn)題示例
這篇文章主要介紹了Python基于回溯法子集樹(shù)模板解決全排列問(wèn)題,簡(jiǎn)單描述了全排列問(wèn)題并結(jié)合實(shí)例形式分析了Python使用回溯法子集樹(shù)模板解決全排列問(wèn)題的具體步驟與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-09-09

