[TOC]前端
from django.conf.urls import url from app import views urlpatterns = [ url(r'^test/$', views.APIViewSourceCode.as_view()), ]
from rest_framework.views import APIView class APIViewSourceCode(APIView): def get(self, request): pass def post(self, request): pass
APIViewSourceCode
類中的as_view()
方法因爲APIViewSourceCode
類中沒有as_view()
方法, 因而去APIViewSourceCode
的父類APIView
中尋找as_view()
.python
APIView
源碼:rest_framework\views.py
文件中下的 class APIView(View)
:django
能夠看出, APIView
源碼中的as_view()
方法會去執行它父類(View
)的as_view
方法.app
APIView(View)
的父類View
源碼:View
的源碼是這樣的:post
View
的源碼中能夠分析出, 執行View
的as_view
方法意味着要去執行當前調用對象的dispatch
方法.dispatch
方法很顯然, 咱們自定義的CBV中沒有dispatch
方法, 因而咱們去APIViewSourceCode
的父類APIView
中尋找dispatch
方法:url
能夠看出, APIView
重寫了它的父類View
的dispatch
方法, 在APIView
的dispatch
方法中, 它對最開始自定義CBV的request進行了初始化, 目的是爲了給最初的request添加額外的功能. 那麼咱們如今去initialize_request
中看看到底添加了什麼額外的功能.spa
initialize_request
initialize_request
最後返回了一個Request
對象, 該對象接收了自定義CBV中的request. 咱們再來看看這個Request
對象進行了什麼樣的處理.3d
Request
對象中弄清楚Django的request對象被添加了什麼新功能(屬性)rest
request.query_params
能夠拿到原來URL裏面的參數request.data
能夠拿到前端提交過來的全部數據