Django框架之DRF APIView Serializer

1、APIView

咱們在使用DjangoRestfulFramework的時候會將每一個視圖類繼承APIView,取代原生Django的View類django

APIView的流程分析:session

rest_framework>>views.py>>APIView函數

進入APIViewpost

APIView>>as_view

as_view方法(此方法會在Django啓動時,在路由文件內執行,最終返回一個view函數內存地址) spa

接下來咱們回顧一下Django原生的as_view內的view方法內容:3d

或者經過代碼點進去View,找到原生as_viewrest

from django.views import View

APIView>>dispatch

根據圖片分析,最終會走到APIView中的dispatch方法,咱們找到它:code

 關鍵代碼:initialize_requestcsrf

 找到initialize_request(APIView內)中間件

關鍵代碼:initial

找到initial(APIView內)

 

接下來小結一下APIView大體流程:

  APIView內的as_view>>原生Django的as_view方法,返回view函數內存地址,而後繼續在APIView的as_view中返回這個view內存地址,同時這個view被裝飾了一個禁用csrf的一個裝飾器>>在成功匹配到路由進入視圖函數時候,就會走view()執行,view會返回dispatch(),走APIView的dispatch方法>>在dispatch方法內經過Request類的封裝,將原生Django的request對象封裝到Request類中,實例化的request對象就是drf產生的新的request,同時還封裝了3個重要的校驗方法:權限、認證、頻率>>最後dispatch方法根據getattr反射獲得請求方式對應的咱們寫的類中的請求方法(好比請求是get就走get函數方法,是post就走post函數方法),而後對請求進行處理、響應。

這裏補充幾個源碼的處理細節:

APIView>>request對象

它是drf的Request類的對象

 

APIView>>request對象>>query_params

 

 繼續挖掘:

Django原生的request對象

咱們在一個視圖類中打印一下type(request._request)

GET方法:

 GET方法小結:

Django原生request裏面有個GET(以get形式提交的數據),提交get數據時都拆到environ內部,Django把數據取出來轉成了QueryDict的對象

引申:session不是原生request對象的屬性,它是在中間件中放進去的('django.contrib.sessions.middleware.SessionMiddleware')

DRF的Request類:

__getattr__方法重寫:

2、Serializer序列化

 校驗源碼:is_valid()

首先須要知道,何時會走is_valid:調用了對象.is_valid()時,會對反序列化的對象進行校驗

進入is_valid源碼:

注意咱們是在BaseSerializer中找到的is_valid的

注意這裏走run_validation時候,傳入了initial_data,這個initial_data在BaseSerializer的__init__中有,

那麼,須要分析一下:__init__在何時會觸發,因而找BaseSerializer的子類發現都沒有__init__,因此推出在視圖類中反序列化獲得對象的時候就觸發了__init__,而後緊接着就進行了is_valid的校驗

接下來繼續進入run_validation:這裏不要直接點了,直接點確定是想上找,這裏得從Serializer找,發現還真有:

相關文章
相關標籤/搜索