CBV和FBV

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的官方文档

原文地址:https://www.cnblogs.com/wqzn/p/10009722.html