CBV和FBV

Bound_w發表於2018-11-23

CBV和FBV

  剛開始寫的檢視都是基於函式版本的,稱為FBV,後來寫了一個NB的叫CBV,就是基於類的

  FBV就是在URL中的一個路徑對應一個函式   

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

 

在檢視中
def index(request):
    return render(request, 'index.html')

 

CBV 就是在 URL中對應一個類
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.IndexView.as_view())     # 執行類後面的as_view()方法,是父類裡面的方法
]
在檢視中
from django.views import View


class IndexView(View):
  
    # 以get形式訪問會執行get函式,一般情況下獲取資料
    def get(self, *args, **kwargs):  
        return HttpResponse('666')
      
    # 以post形式訪問的話會執行post函式,一般情況下傳送資料
    def post(self, *args, **kwargs):  
        return HttpResponse('999')

 

注意:
  CBV在定義的時候,必須繼承View
  在定義URL的時候,必須要加as_view
  在類裡面使用form表單提交的話,只有get個post方法
  在類中使用AJAX傳送資料的話,支援定義一下的很多種方法
  restful規範
  get:獲取資料
  post:建立資料,提交資料
  put更新
  delete:刪除
  patch:區域性重新整理
  .....

給CBV新增裝飾器
  如果有多個程式需要使用者登入驗證的話會造成程式碼冗餘,可以使用繼承很好的解決這個問題,但是還有更好的方法,那就是基於裝飾器實現登入驗證
  

  類中的方法與獨立函式不完全相同,因此不能直接將函式裝飾器應用類中的方法,我們需要先將其轉化成方法裝飾器。

  Django中提供了method_decorator裝飾器,用於將函式裝飾器轉換為方法裝飾器。

# CBV版新增班級
from django.views import View
from django.utils.decorators import method_decorator

class AddClass(View):

    @method_decorator(wrapper)
    def get(self, request):
        return render(request, "add_class.html")

    def post(self, request):
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")
# 使用CBV時要注意,請求過來後會先執行dispatch()這個方法,如果需要批量對具體的請求處理方法,如get,post等做一些操作的時候,這裡我們可以手動改寫dispatch方法,這個dispatch方法就和在FBV上加裝飾器的效果一樣。

class Login(View):
     
    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj
 
    def get(self,request):
        return render(request,'login.html')
 
    def post(self,request):
        print(request.POST.get('user'))
        return HttpResponse('Login.post')
有關CBV的擴充閱讀

request和response的官方文件

相關文章