05 DRF請求生命週期

DRF請求生命週期

  1. 根據應用中urls.py,走as_view方法,可是視圖類沒有該方法,因此請求走的是APIView的as_view方法
  2. 在APIView的as_view調用父類(django原生View)的as_view,同時還禁用了 csrf 認證
  3. 在父類(django原生View)的as_view中dispatch方法請求走的又是APIView的dispatch
    由於APIView也能夠走dispatch,視圖類是先繼承APIView,APIView中沒有再去原生View中
  4. 完成任務分發,交給視圖類的請求函數處理,獲得請求的響應結果,返回給前臺,因此之後直接就從APIView的dispatch入口看源碼

前期準備

#路由層 urls.py:
from django.conf.urls import url,include
from django.contrib import admin
from . import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/', views.test.as_view()),
]  

#視圖層 views.py
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response

class test(APIView):
    def get(self,reqeust,*args,**kwargs):
        return Response('drf get ok')
    def post(self,request,*args,**kwargs):
        return Response('drf post ok')

源碼分析

  1. 根據應用中urls.py,走as_view方法,可是視圖類沒有該方法,因此請求走的是APIView的as_view方法
    python

  2. view = super().as_view(**initkwargs)調用父類的as_view 也就是django原生的base.py中的as_view
    以後再此基礎上增長了 return csrf_exempt(view) 繼承了APIView的視圖類,會禁用csrf認證,這樣就須要在settings中註釋

    django

  3. 在第二步是調用父類的as_view方法,此方法中有個關鍵的分發方法return self.dispatch(request, *args, kwargs) (入口:view = super().as_view(initkwargs))
    函數

  4. APIView中重寫了dispatch方法
    源碼分析

  5. 完成任務方法交給視圖類的請求函數處理,獲得請求的相應結果,返回給前臺post

相關文章
相關標籤/搜索