JSONRenderer不生效主因是Accept头缺失或renderer_classes未显式设置;序列化器需调用is_valid()和save()确保data非空;中文乱码、时间格式、Decimal精度问题源于序列化器字段配置而非渲染器;务必用Response()而非手动render()。

DRF里JSONRenderer不生效?检查renderer_classes和Accept头
DRF默认用JSONRenderer,但实际返回HTML或报406错误,多半是请求没带Accept: application/json头,或者视图没显式声明renderer_classes。Django开发服务器默认响应HTML,浏览器直接访问API地址时不会自动加JSON头。
- 视图类中必须显式设置
renderer_classes = [JSONRenderer],尤其混用HTML模板和API时 - 测试用
curl -H "Accept: application/json" http://localhost:8000/api/xxx,别只在浏览器里点链接 - 如果用了
APIView但继承自TemplateView之类,renderer_classes会被父类覆盖,得重写 - 全局配置
DEFAULT_RENDERER_CLASSES在settings.py里有效,但单个视图优先级更高
序列化器返回空字典或None?确认data已调用.is_valid()和.save()
JSONRenderer只负责把Python对象转成JSON字符串,它不碰序列化逻辑。常见现象是返回{}或null,其实是serializer.data本身为空——比如忘了调.is_valid(raise_exception=True),或.save()失败没抛异常,导致serializer.data还是初始空状态。
- GET请求:确保
serializer = MySerializer(queryset, many=True)后,再取serializer.data - POST请求:必须先
serializer.is_valid(raise_exception=True),再serializer.save(),最后才serializer.data - 不要直接
JSONRenderer().render(serializer)——serializer不是字典,得传serializer.data - 如果字段有
source='*'或write_only=True,检查是否漏了read_only=True导致输出为空
中文乱码、时间格式不对、Decimal变字符串?看JSONRenderer的参数和字段定义
JSONRenderer底层用Pythonjson.dumps(),默认不处理编码和特殊类型。中文显示为\uXXXX、datetime变成ISO字符串但带T、Decimal被转成float丢失精度——这些都不是渲染器的问题,而是序列化器字段或JSON选项没配对。
强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该
- 中文乱码:确保HTTP响应头含
Content-Type: application/json; charset=utf-8,DRF默认已设,但自定义Response时要手动加content_type="application/json; charset=utf-8" - 时间格式:在
DateTimeField里加format='iso-8601'或format='%Y-%m-%d %H:%M',别依赖默认 - Decimal精度:用
DecimalField(max_digits=10, decimal_places=2),避免用FloatField - 不想用ISO时间?重写
to_representation()方法,或用SerializerMethodField控制输出
用Response()还是直接render()?别绕过DRF的响应生命周期
有人想“手动”调JSONRenderer().render(data)然后return HttpResponse,这会跳过DRF的异常处理、内容协商、缓存头等机制,容易埋坑。
- 始终用
Response(data)(来自rest_framework.response),它内部自动调JSONRenderer并设好headers - 如果要改状态码,用
Response(data, status=status.HTTP_400_BAD_REQUEST),别自己拼status_text - 自定义渲染器时,继承
JSONRenderer并重写.render(),而不是每次手动调 - 调试时打印
response.accepted_renderer,确认当前用的是JSONRenderer,不是BrowsableAPIRenderer
最常被忽略的是:JSONRenderer只管“怎么转”,不管“转什么”。数据结构、字段可见性、嵌套层级、空值处理,全在序列化器里定。渲染器配得再准,序列化器漏了个required=False或写错source,前端照样收不到字段。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










