1. 程式人生 > >DRF之APIView源碼解析

DRF之APIView源碼解析

() ngs from imp info com .py 提交 pat

目錄

  • Django項目中的代碼如下
  • APIView源碼解析
  • 源碼解析總結

Django項目中的代碼如下

  • urls.py中:
from django.conf.urls import url
from app import views

urlpatterns = [
    url(r'^test/$', views.APIViewSourceCode.as_view()),
]
  • views.py中:
from rest_framework.views import APIView
class APIViewSourceCode(APIView):
    def get(self, request):
        pass
    def post(self, request):
        pass

APIView源碼解析

1.啟動Django項目
2.加載settings.py文件
3.讀取models.py文件
4.加載views.py文件
5.加載urls.py文件
6.執行urls.py文件

技術分享圖片

7.執行views.py文件中的APIViewSourceCode類中的as_view()方法

技術分享圖片

由於APIViewSourceCode類中沒有as_view()方法, 於是去APIViewSourceCode的父類APIView中尋找as_view().

8.點擊進入APIView源碼:

rest_framework\views.py文件中下的 class APIView(View):

技術分享圖片

可以看出, APIView源碼中的as_view()方法會去執行它父類(View)的as_view方法.

9.點擊進入APIView(View)的父類View源碼:

技術分享圖片

View的源碼是這樣的:

  • 第一部分:

技術分享圖片

  • 第二部分:

技術分享圖片

  • 總結: 從View的源碼中可以分析出, 執行Viewas_view方法意味著要去執行當前調用對象的dispatch方法.
10.由於當前調用對象是我們自定義的CBV,所以我們去自定義CBV中尋找dispatch方法

技術分享圖片

很顯然, 我們自定義的CBV中沒有dispatch方法, 於是我們去APIViewSourceCode的父類APIView中尋找dispatch方法:

技術分享圖片

可以看出, APIView重寫了它的父類Viewdispatch方法, 在APIViewdispatch方法中, 它對最開始自定義CBV的request進行了初始化, 目的是為了給最初的request添加額外的功能. 那麽我們現在去initialize_request中看看到底添加了什麽額外的功能.

11.點擊進入initialize_request

技術分享圖片

initialize_request最後返回了一個Request對象, 該對象接收了自定義CBV中的request. 我們再來看看這個Request對象進行了什麽樣的處理.

12.點擊進入Request對象中

技術分享圖片

技術分享圖片

源碼解析總結

弄清楚Django的request對象被添加了什麽新功能(屬性)

技術分享圖片


  • request.query_params可以拿到原來URL裏面的參數
  • request.data可以拿到前端提交過來的所有數據
  • 等等(待續...)


DRF之APIView源碼解析