FBV和CBV的区别

一、CBV  Class-Base-View

  CBV是采用面向对象的方法写视图文件

  执行流程:

    浏览器向服务器发送请求,

    服务器端的urls.py根据请求匹配URL,找到要执行的视图类,

    执行dispatch方法区分出是POST还是GET请求,

    执行views.py对应类中的POST方法或者GET方法。

  url中: 

url(r'^add_class/$', views.AddClass.as_view()),

  views中:

from django import views #在views.py的基础上添加
class Login(views.Views):
    def get(self,request)
        pass
    def pass(self,request)
        pass        

使用装饰器:

类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。

Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。

class Login(views.View):
    @method_decorator(outer)
    def get(self,request,*args,**kwargs):
        pass    

 二、FBV

FBV即在views.py中以函数的形式写视图

urls:

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

views.py:

from django.shortcuts import render
def index(request):
    pass

装饰器:

FBV本身就是一个函数,所以和给普通的函数加装饰器无差:
def wrapper(func):
    def inner(*args, **kwargs):
        start_time = time.time()
        ret = func(*args, **kwargs)
        end_time = time.time()
        print("used:", end_time-start_time)
        return ret
    return inner


@wrapper
def add_class(request):
    pass

本质上FBV和CBV都是一样的,因为url对应都是一个函数。

url(r'^order/', views.order,name='order'), # 1. 对应order函数;2.一旦请求到来,立即执行order函数

url(r'^center/', views.CenterView.as_view(),name='center'),

  # 1. url对应 views.CenterView.as_view()会返回一个view函数;

  2. 请求到来之后,立即执行view函数,view由会触发dispatch方法、

  dispatch会根据method不同根据反射执行get/post/delete...的方法。

posted @ 2018-11-02 20:42  梁颖666  阅读(515)  评论(0)    收藏  举报