作用
根據 用戶請求URL 或 用戶可接受的類型,篩選出合適的 渲染組件。
內置渲染器
from rest_framework.renderers import JSONRenderer
from rest_framework.renderers import BrowsableAPIRenderer
from rest_framework.renderers import AdminRenderer
from rest_framework.renderers import HTMLFormRenderer
顯示json格式:JSONRenderer
訪問URL:
默認顯示格式:BrowsableAPIRenderer(可以修改它的html文件)
訪問URL:
表格方式:AdminRenderer
訪問URL:
- http://127.0.0.1:8000/test/?format=admin
- http://127.0.0.1:8000/test.admin
- http://127.0.0.1:8000/test/
form表單方式:HTMLFormRenderer
訪問URL:
源碼分析
源碼入口
APIView類的dispatch方法中:self.response = self.finalize_response(request, response, *args, **kwargs)
源碼分析
# 最後解析reponse對象數據
self.response = self.finalize_response(request, response, *args, **kwargs) 點進去
# 拿到運行的解析類的對象們
neg = self.perform_content_negotiation(request, force=True) 點進去
# 獲得解析類對象
renderers = self.get_renderers() 點進去
# 從視圖類中得到renderer_classes請求類,如何實例化一個個對象形參解析類對象列表
return [renderer() for renderer in self.renderer_classes]
# 重點:self.renderer_classes獲取renderer_classes的順序
# 自己視圖類的類屬性(局部配置) =>
# APIView類的類屬性設置 =>
# 自己配置文件的DEFAULT_RENDERER_CLASSES(全局配置) =>
# drf配置文件的DEFAULT_RENDERER_CLASSES
使用
- 全局配置 所有視圖類統一處理
在項目的settings.py中
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer']
}
- 局部配置 某一個或一些實體類單獨處理
在views.py視圖類中提供對應的類屬性
from rest_framework.renderers import JSONRenderer
class Test2(APIView):
# 局部配置
renderer_classes = [JSONRenderer] # 所在類局部配置
def get(self, request, *args, **kwargs):
return Response('drf get ok 2')
def post(self, request, *args, **kwargs):
return Response('drf post ok 2')
在setting.py中配置REST_FRAMEWORK,完成的是全局配置,所有接口統一處理
如果只有部分接口特殊化,可以完成 - 局部配置