Django框架 CBV及原始碼分析

2022-01-21 14:03:12 字數 2849 閱讀 1692

cbv (基於類的檢視函式)

**示例:

urls.py

url(r'

^login/

',views.mylogin.as_view())

views.py

from django.views import

view

class

mylogin(view):

defget(self,request):

print("

from mylogin get方法")

from mylogin post方法

")

研究方向:

1.從url進入

url(r'

^login/

',views.mylogin.as_view())

由於函式名加括號執行優先順序最高,所以這一句話一寫完會立刻執行as_view()方法,返回view

@classonlymethod

def as_view(cls, **initkwargs): #

cls就是我們自己的寫的類 mylogin

defview(request, *args, **kwargs):

self = cls(**initkwargs) #

例項化產生mylogin的物件 self = mylogin(**ininkwargs)

if hasattr(self, '

get') and

not hasattr(self, '

head'):

self.head =self.get

self.request =request

self.args =args

self.kwargs =kwargs

#上面的幾句話都僅僅是在給物件新增屬性

return self.dispatch(request, *args, **kwargs) #

dispatch返回什麼 瀏覽器就會收到什麼

#物件在查詢屬性或者方法的時候 你一定要默念 先從物件自己這裡找 然後從產生物件的類裡面找 最後類的父類依次往後

returnview

通過原始碼發現url匹配關係可以變形成

url(r'

^login/

',views.mylogin.view) #

fbv和cbv在路由匹配上是一致的 都是url後面跟函式的記憶體位址

2.當瀏覽器中輸入login會立刻觸發view函式的執行,走上面的view函式,再進入到dispatch方法

def dispatch(self, request, *args, **kwargs):

#try to dispatch to the right method; if a method doesn't exist,

#defer to the error handler. also defer to the error handler if the##

我們先以get為例

判斷當前請求方法是否在預設的八個方法內

#反射獲取我們自己寫的類產生的物件的屬性或者方法

#以get為例 request.method.lower()是get handler = getattr(self,'get','取不到報錯的資訊')

直接呼叫我們自己的寫類裡面的get方法

#原始碼中先通過判斷請求方式是否符合預設的八個請求方法 然後通過反射獲取到自定義類中的對應的方法執行

通過獲取對應的方法(get,post),然後執行view.py中對應的請求方法

django快速新建測試指令碼

1.隨便新建乙個test.py檔案做測試檔案

2.寫如下**

import

osif

__name__ == "

__main__":

os.environ.setdefault(

"django_settings_module

", "

mysqltest.settings

") #前面這幾行是從manage.py複製的

FBV與CBV 及CBV原始碼分析

fbv function based view 基於函式的檢視 基於函式的檢視,我們一直在用沒啥好講的,就是匯入模組呼叫函式執行業務 cbv class based view 基於類的檢視 路由 url r haha views.zx view.as view 檢視 class zx view vi...

CBV原始碼分析

html 這裡只是單純的用來做請求而已,沒什麼用處,只是讓後端來判斷走哪個方法 view from django.views import view class myreg view def get self,request return render request,reg.html def po...

Django中CBV的執行順序之原始碼解析

django中的cbv的執行順序 下圖為cbv方式的執行順序,大概執行流程如下 其中淺藍色為在假設自己寫的類,即test類中沒有dispatch方法的情況下的執行順序,當自己的類中有dispatch方法時就執行自己的 黃色為不合法的請求方式時的執行流程,在dispatch方法中判斷請求方式之前,請求...