DRF之APIView源碼解析
阿新 • • 發佈:2019-01-20
() ngs from imp info com .py 提交 pat 7.執行views.py文件中的
8.點擊進入
9.點擊進入
10.由於當前調用對象是我們自定義的CBV,所以我們去自定義CBV中尋找
11.點擊進入
12.點擊進入
目錄
- 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
的源碼中可以分析出, 執行View
的as_view
方法意味著要去執行當前調用對象的dispatch
方法.
10.由於當前調用對象是我們自定義的CBV,所以我們去自定義CBV中尋找dispatch
方法
很顯然, 我們自定義的CBV中沒有dispatch
方法, 於是我們去APIViewSourceCode
的父類APIView
中尋找dispatch
方法:
可以看出, APIView
重寫了它的父類View
的dispatch
方法, 在APIView
的dispatch
方法中, 它對最開始自定義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源碼解析