APIView指定默认render class后不按Accept Header返回HTML或JSON问题
问题根因
你在视图中指定了renderer_classes = [TemplateHTMLRenderer],等于强制限制该视图仅能使用HTML模板渲染器处理响应,DRF的内容协商机制会直接忽略请求的Accept头,也不会响应你在Response中传入的content_type='json'参数,自然所有返回都只能是HTML格式。
解决方法
你只需要把JSON渲染器也加入当前视图的渲染器列表,让DRF可以根据Accept头自动匹配对应的渲染方式即可,不需要手动写Accept头判断逻辑,DRF原生的内容协商功能已经覆盖了这个场景。
修正后代码示例
import os from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.renderers import JSONRenderer, TemplateHTMLRenderer class HomeView(APIView): template_name = 'blog_app/home.html' # 同时注册两种渲染器,DRF会自动根据请求Accept头选择对应渲染器 renderer_classes = [TemplateHTMLRenderer, JSONRenderer] def get(self,request): context = os.getcwd() # 不需要手动判断Accept头,直接返回响应即可 return Response({'dir': context})
补充说明
- 如果你在项目全局配置的
DEFAULT_RENDERER_CLASSES中已经包含了JSONRenderer,也可以选择不删除视图层的renderer_classes配置,只要把JSONRenderer加到列表里即可。 - 如果你确实需要手动控制渲染逻辑,也可以在返回Response时通过
renderer_classes参数临时指定渲染器,比如JSON响应时写return Response({'dir':context}, renderer_classes=[JSONRenderer]),效果是一样的。
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

