Django高階之FBV和CBV

2022-06-02 01:42:10 字數 3769 閱讀 7753

django的請求生命週期是指當使用者在瀏覽器上輸入url到使用者看到網頁的這個時間段內,django後台所發生的事情。

當使用者在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端。

url經過django中的wsgi,再經過django的中介軟體,最後到達路由對映表,在路由中一條一條進行匹配,一旦其中一條匹配成功就執行對應的檢視函式,後面的路由就不再繼續匹配了。

檢視函式根據客戶端的請求查詢相應的資料,返回給django,然後django把客戶端想要的資料做為乙個字串返回。

經過一系列的中介軟體,最後到達客戶端。

客戶端瀏覽器接收到返回的資料,經過渲染後顯示給使用者。

上面是fbv模式的請求過程。其實除了fbv之外django還支援cbv模式。cbv模式的請求過程和fbv有些不同(下面會講解二者的不同)。

當服務端使用cbv模式的時候,服務端通過路由對映匹配成功後會自動去執行對應類中的dispatch方法,然後會通過dispatch反射

的方式找到類中對應的方法並執行類中的方法,執行完畢之後,會把客戶端想要的資料返回給dispatch方法,由dispatch方法把資料返回給客戶端。

fbv(function base views)基於函式的檢視, 就是在檢視裡使用函式處理請求。

urls.py:

urlpatterns = [

url(r'^index/', views.index),

]

views.py:

def index(request):

if request.method == 'get':

return httpresponse('get請求')

elif request.method == 'post':

return httpresponse('post請求')

fbv模式需要自己判斷請求方式,根據請求方式的不同執行不同的操作。

cbv(class base views)基於類的檢視, 就是在檢視裡使用類處理請求。

urls.py:

urlpatterns = [   

url(r'^student/', views.studentview.as_view()),

]

views.py:

from django.views import view

class studentview(view):

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

return httpresponse('get請求')

當服務端使用cbv模式的時候,服務端通過路由對映匹配成功後會自動去執行對應類中的dispatch方法,然後會通過dispatch反射的方式找到類中對應的方法並執行類中的方法,執行完畢之後,會把客戶端想要的資料返回給dispatch方法,由dispatch方法把資料返回給客戶端。

幫助理解cbv的執行過程:

class studentview(view):

# 呼叫父類的dispatch(預設),並做些自己需要的操作

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

if request.method == 'get': # 在指定的請求方法到來時先做的操作。

print('get 請求')

print('before') # 在所有的請求方法到來時先做的操作

result = super(studentview, self).dispatch(request, *args, **kwargs)

print('after')

return result

# 攔截(證明最後的資料是由dispatch返回給客戶端的)

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

# return httpresponse('攔截')

# 自定義dispatch

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

# func = getattr(self, request.method.lower()) # self = studentview()

# return func(request, *args, **kwargs)

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

return httpresponse('get請求')

當有多個檢視類都需要在dispatch方法中執行一些形同的操作是我們可以採用繼承的方式:

class

mybaseview(object):

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

if request.method == '

get': #

在指定的請求方法到來時先做的操作。

print('

get 請求')

print('

before

') #

在所有的請求方法到來時先做的操作

get請求')

teacherview中的get請求')

teacherview中的post請求

')

view code

在上面的**中我們需要弄明白的一點是super()的作用,看下面這行**

result = super().dispatch(request, *args, **kwargs)
我們平常可能認為上面這行**的super()是執行mybaseview類的父類中的dispatch方法,但是我們會發現mybaseview的父類繼承的是object類,但是object類中沒有dispatch方法啊,這是怎麼回事呢。

其實super()並不是簡單的執行父類中的方法。super(mybaseview, self) 獲得的是 mybaseview類 在 self這個物件的 mro 列表中的下乙個類。關於super()的詳細介紹轉到你不知道的super

Django中的FBV和CBV區別

fbv就是在url中乙個路徑對應乙個函式 urlpatterns url r admin admin.site.urls url r index views.index 在檢視函式中 def index request return render request,index.html cbv就是在u...

Django中的FBV和CBV對比分析

在學習django過程中在views.py進行邏輯處理時接觸到了兩種檢視的書寫風格,fbv和cbv fbv 指 function based views,即基於函式的檢視 cbv 指 class based views,即基於類的檢視 基於類的檢視相較於基於函式的檢視可以更加便利的實現類的繼承封裝等...

詳解Django中的FBV和CBV對比分析

在學習django過程中在views.py進行邏輯處理時接觸到了兩種檢視的書寫風格,fbv和cbv fbv 指 function based views,即基於函式的檢視 cbv 指 class based views,即基於類的檢視 基於類的檢視相較於基於函式的檢視可以更加便利的實現類的繼承封裝等...