FBV : function base views, 就是在視圖里使用函數(shù)處理請(qǐng)求。
urlpatterns = [ path('index/', views.index), ] # 視圖函數(shù)里 def index(request): return render(request,"index.html")
CBV : class base views, 就是在視圖里使用類(lèi)處理請(qǐng)求。
urlpatterns = [ path("login/",views.LoginView.as_view()) ] # 視圖函數(shù)里 class LoginView(View): def dispatch(self, request, *args, **kwargs): """ 重寫(xiě)dispatch方法, 可以放一些專(zhuān)屬于LoginView的操作 """ return ... def get(self,request): return HttpResponse("OK") def post(self,request): return HttpResponse("OK") def put(self,request): return HttpResponse("OK") def delete(self,request): return HttpResponse("OK")
CBV的源碼剖析:
Django的url是將一個(gè)請(qǐng)求分配給可調(diào)用的函數(shù)的,而不是一個(gè)class。針對(duì)這個(gè)問(wèn)題,class-based view(即Django的基礎(chǔ)View類(lèi))提供了一個(gè) as_view() 的靜態(tài)方法(也就是類(lèi)方法),調(diào)用這個(gè)方法,會(huì)通過(guò) self = cls(**initkwargs) 創(chuàng)建一個(gè)類(lèi)的實(shí)例,然后通過(guò)實(shí)例調(diào)用 dispatch()方法,dispatch()方法會(huì)根據(jù)request的method的不同調(diào)用相應(yīng)的方法來(lái)處理request(如get() , post()等)。到這里,這些方法和function-based view差不多了,要接收request,得到一個(gè)response返回。如果方法沒(méi)有定義,會(huì)拋出HttpResponseNotAllowed異常。
為什么要有CBV這種模式?
python的一大重要的特性就是面向?qū)ο?。而cbv更能體現(xiàn)python的面向?qū)ο蟆bv是通過(guò)class的方式來(lái)實(shí)現(xiàn)視圖方法的。class相對(duì)于function,更能利用多態(tài)的特定(多態(tài): 可對(duì)不同類(lèi)的對(duì)象使用同樣的操作),因此更容易從宏觀層面上將項(xiàng)目?jī)?nèi)的比較通用的功能抽象出來(lái)。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com