Django POST请求报错:.accepted_renderer not set on Response 求助
解决Django DRF中POST请求触发
.accepted_renderer not set on Response的AssertionError 这个错误的核心是返回的Response对象未经过DRF的渲染流程处理,导致accepted_renderer属性未被正确绑定。结合你的场景,按以下步骤排查:
1. 检查视图返回的Response类型
确认视图的create、perform_create或其他自定义方法中,是否误用了Django原生的django.http.Response而非DRF的rest_framework.response.Response。DRF的Response类会自动处理渲染器绑定逻辑,原生Response则不会。
错误示例:
from django.http import Response class ItemAPIView(CSRFEnabledApiViewMixin, CreateAPIView, RetrieveUpdateDestroyAPIView): def perform_create(self, serializer): instance = serializer.save() return Response({"id": instance.id})
修正写法:
from rest_framework.response import Response class ItemAPIView(CSRFEnabledApiViewMixin, CreateAPIView, RetrieveUpdateDestroyAPIView): def perform_create(self, serializer): instance = serializer.save() return Response({"id": instance.id})
2. 排查CSRFEnabledApiViewMixin的实现
自定义的CSRFEnabledApiViewMixin可能重写了DRF APIView的关键方法(比如finalize_response)但未调用父类方法,打断了DRF的渲染流程。
检查mixin代码,如果存在类似错误实现:
class CSRFEnabledApiViewMixin: def finalize_response(self, request, response, *args, **kwargs): # 仅处理CSRF逻辑,未调用父类方法 response["X-CSRFToken"] = request.COOKIES.get("csrftoken") return response
必须补充调用父类方法,确保DRF完成渲染器设置:
class CSRFEnabledApiViewMixin: def finalize_response(self, request, response, *args, **kwargs): # 先执行DRF核心流程 response = super().finalize_response(request, response, *args, **kwargs) # 再添加自定义CSRF逻辑 response["X-CSRFToken"] = request.COOKIES.get("csrftoken") return response
3. 临时移除自定义mixin验证
暂时将视图改为仅继承DRF基类:
class ItemAPIView(CreateAPIView, RetrieveUpdateDestroyAPIView): # 保留原有其他代码
测试POST请求是否恢复正常。如果正常,说明问题确实出在CSRFEnabledApiViewMixin中,回到步骤2继续排查。
4. 确认DRF版本兼容性
检查你的Django REST Framework版本是否与Django 3.2.15兼容,DRF 3.12.x及以上版本支持Django 3.2,过低版本可能存在流程冲突。
内容的提问来源于stack exchange,提问作者Artem Liubymov
相关产品推荐
相关产品推荐

