DRF之APIView源碼解析

[TOC]前端

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().python

8.點擊進入APIView源碼:

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

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

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

View的源碼是這樣的:post

  • 第一部分:

  • 第二部分:

  • 總結: 從View的源碼中能夠分析出, 執行Viewas_view方法意味着要去執行當前調用對象的dispatch方法.
10.因爲當前調用對象是咱們自定義的CBV,因此咱們去自定義CBV中尋找dispatch方法

很顯然, 咱們自定義的CBV中沒有dispatch方法, 因而咱們去APIViewSourceCode的父類APIView中尋找dispatch方法:url

能夠看出, APIView重寫了它的父類Viewdispatch方法, 在APIViewdispatch方法中, 它對最開始自定義CBV的request進行了初始化, 目的是爲了給最初的request添加額外的功能. 那麼咱們如今去initialize_request中看看到底添加了什麼額外的功能.spa

11.點擊進入initialize_request

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

12.點擊進入Request對象中

源碼解析總結

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


  • request.query_params能夠拿到原來URL裏面的參數
  • request.data能夠拿到前端提交過來的全部數據
  • 等等(待續...)
相關文章
相關標籤/搜索