JsonResponse 全景速记
【摘要】 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)