You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:24:06