zoukankan      html  css  js  c++  java
  • 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的官方文档

  • 相关阅读:
    你是老鸟吗?但是有些你可能目前都不知道的东西
    工具类合集
    也谈Flash mmorpg地图问题【转】
    大量实用工具类、开源包,该帖绝对值得你收藏!
    如何设计产品【页游】
    网络游戏中,玩家常常询问什么时候开新服,其中的本质需求是什么?
    大将军UE分析
    天天连萌UE分析
    selenium IDE 回放报错
    jenkins配置
  • 原文地址:https://www.cnblogs.com/wqzn/p/10009722.html
Copyright © 2011-2022 走看看