drf的渲染模塊

drf的渲染模塊(瞭解)

  1. 能夠在視圖類中經過renderer_classes類屬性對該視圖的數據響應渲染作配置 - 局部配置
  2. 能夠在項目的配置文件的drf配置中經過DEFAULT_RENDERER_CLASSES對該視圖的數據響應渲染作配置 - 全局配置
    注:若是一個視圖類在有全局配置下,還進行了局部配置,優先走本身的局部配置

drf 必需要進行配置python

INSTALLED_APPS = [
    ...
    'rest_framework'
]

局部配置

直接在類中進行配置django

from rest_framework.renderers import JSONRenderer  # json格式的渲染
from rest_framework.renderers import BrowsableAPIRenderer  # 瀏覽器格式的渲染


# JSONParser: json數據
# FormParser: urlencoded
# MultiPartParser:form-data
class Book(APIView):
    renderer_classes = [JSONRenderer,]### json格式的渲染
    
    def get(self, request, *args, **kwargs):
        return Response('get ok')

renderer_classes = [BrowsableAPIRenderer,]###瀏覽器渲染

renderer_classes = [BrowsableAPIRenderer,JSONRenderer]
#倆個都有 會選擇第一個
renderer_classes = []#若是爲空 的話就沒法請求

全局配置

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        # 'rest_framework.renderers.BrowsableAPIRenderer',
    ],
    
}

開發通常只會配置JSONRenderer,防止破解json

有全局和局部都配置的狀況下,優先走局部配置api

渲染模塊源碼分析

  1. 二次處理響應對象:APIView的dispatch方法 - self.finalize_response(request, response, *args, **kwargs)
  2. 獲取渲染類對象:進入finalize_response方法 - self.perform_content_negotiation(request, force=True)
  3. 從配置文件中獲得渲染類對象:perform_content_negotiation -> self.get_renderers() -> [renderer() for renderer in self.renderer_classes]

核心:能夠全局和局部配置視圖類支持的結果渲染:默承認以json和頁面渲染,學習該模塊的目的是開發能夠全局只配置json方式渲染瀏覽器

入口:dispatch()方法源碼分析

#     二次處理,渲染模塊
self.response = self.finalize_response(request, response, *args, **kwargs)
if isinstance(response, Response):
            if not getattr(request, 'accepted_renderer', None):
                # 內部解析了配置的渲染類
                neg = self.perform_content_negotiation(request, force=True)
                # 解壓賦值
                request.accepted_renderer, request.accepted_media_type = neg
def perform_content_negotiation(self, request, force=False):
        """
        Determine which renderer and media type to use render the response.
        """
        # 獲取渲染的方式
        renderers = self.get_renderers()
        conneg = self.get_content_negotiator()

        try:
            return conneg.select_renderer(request, renderers, self.format_kwarg)
        except Exception:
            if force:
                # 獲取第一個渲染方式
                return (renderers[0], renderers[0].media_type)
            raise
def get_renderers(self):
        """
        Instantiates and returns the list of renderers that this view can use.
        """
        # 找rederers_classes方法
        return [renderer() for renderer in self.renderer_classes]
class APIView(View):

    # The following policies may be set at either globally, or per-view.
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

首先找本身的配置,本身沒有找局部配置,而後找全局配置,最後找django配置的學習

相關文章
相關標籤/搜索