Django中返回JSON数据的两种实现方式:HttpResponse与JsonResponse
本文详解在Django框架中向客户端返回JSON数据的两种主要方法。首先介绍使用Python原生json模块配合HttpResponse手动设置Content-Type的方式;其次深入解析Django内置的JsonResponse类,重点说明处理非字典类型数据时需设置safe=False参数的原因及具体用法,帮助开发者正确实现前后端数据交互。
Django返回JSON数据概述
在Web开发中,前后端数据交互频繁,JSON因其轻量且易于解析的特性,成为数据传输的首选格式。
在Django框架中实现JSON数据返回,主要有两种途径:一是利用Python标准库中的json模块结合HttpResponse类;二是直接使用Django提供的JsonResponse类。
使用HttpResponse手动设置Content-Type
第一种方法:通过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,但浏览器将其解析为普通字符串。这是因为未明确告知浏览器响应内容的类型,因此需要显式指定Content-Type。
HttpResponse类继承自HttpResponseBase,我们可以通过设置content_type参数来告知浏览器传输的是application/json类型数据。调整代码中的content_type参数后,观察响应变化。
def testjson(request):
data={
'patient_name': '张三',
'age': '25',
'patient_id': '19000347',
'诊断': '上呼吸道感染',
}
return HttpResponse(json.dumps(data), content_type='application/json')
再次访问该网页接口:


此时响应正确传输了JSON格式数据,在浏览器的Preview(预览)功能中可以正常解析并显示JSON结构。
使用JsonResponse简化开发
第二种方法:利用Django内置的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字符串,且支持列表等类型。我们尝试修改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数据库,其返回结果往往不支持直接输出为字典,而是以列表形式呈现。此时,使用JsonResponse(data, safe=False)即可直接将列表转换为JSON格式并发送至前端。
至此,关于Django中返回JSON数据的两种实现方法介绍完毕。如需了解更多Django JSON相关技术细节,请查阅本站往期文章或继续浏览后续内容,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













