Django中返回JSON数据的两种实现方式:HttpResponse与JsonResponse

陆景行
陆景行
发布时间:2026-10-13 | 6人浏览过
原创

本文详解在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相关技术细节,请查阅本站往期文章或继续浏览后续内容,感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表