JsonResponse 全景速记

举报
周杰伦本人 发表于 2025/08/31 20:37:59 2025/08/31
【摘要】 JsonResponse 全景速记 一、为什么选 JsonResponse``在前后端分离、小程序、Vue/React 盛行的今天,90% 的接口返回都是 JSON。Django 自带的 JsonResponse 就是一把“瑞士军刀”,帮你把 Python 字典 / 列表一键变成浏览器能识别的 JSON 字符串,并自动加上正确的 Content-Type: application/json...

JsonResponse 全景速记

一、为什么选 JsonResponse

``在前后端分离、小程序、Vue/React 盛行的今天,90% 的接口返回都是 JSON。Django 自带的 JsonResponse 就是一把“瑞士军刀”,帮你把 Python 字典 / 列表一键变成浏览器能识别的 JSON 字符串,并自动加上正确的 Content-Type: application/json


二、最小使用模板

from django.http import JsonResponse

def api_demo(request):
    data = {'name': 'itcast', 'age': 18}
    return JsonResponse(data)        # 等价于手动 dumps + 设置头

浏览器 / Postman 看到:

{"name": "itcast", "age": 18}

三、三个核心参数

参数 类型 默认值 作用
data dict / list 必填 要被序列化的对象
safe bool True 安全开关True 只允许字典;False 允许列表、字符串等
json_dumps_params dict None 透传给 json.dumps(),如 ensure_ascii=False

四、常见场景与“坑”

场景 正确示例 错误示例
返回纯字典 JsonResponse({'code': 0})
返回列表 JsonResponse([1, 2, 3], safe=False) JsonResponse([1, 2, 3]) → 500
中文不乱码 JsonResponse({'city': '顺义'}, json_dumps_params={'ensure_ascii': False}) 默认转 Unicode
自定义状态码 JsonResponse({'msg': 'ok'}, status=201)

五、源码级揭秘

JsonResponse 核心就三行:

if safe and not isinstance(data, dict):
    raise TypeError(...)
json_str = json.dumps(data, **json_dumps_params)
response = HttpResponse(json_str, content_type='application/json')
  • safe=True 时,内部会强制 isinstance(data, dict),防止你误传列表导致前端解析错误。isinstance 是 Python 内置函数,用来 “判断某个对象是不是某个类(或元组里任意一个类)的实例”。也就是说

isinstance(obj, cls) 就是“obj 是不是 cls 家的人?”

  • safe=False 相当于“免责声明”:出了事开发者自己负责

六、实战演练

1️⃣ 列表返回 + 关闭安全校验

girls = [{'name': 'Rose', 'addr': '顺义'}, {'name': 'Jack', 'addr': '昌平'}]
return JsonResponse(girls, safe=False, status=200)

2️⃣ 自定义日期格式

import json, datetime
from django.core.serializers.json import DjangoJSONEncoder

data = {'time': datetime.datetime.now()}
return JsonResponse(
    data,
    encoder=DjangoJSONEncoder
)

七、记忆口诀
字典直接返,列表加 safe=False;中文加 ensure_ascii=False;状态码随手塞。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。