zoukankan      html  css  js  c++  java
  • Django的FBV和CBV

    FBV : function base views,  就是在视图里使用函数处理请求。

    urlpatterns = [
        path('index/', views.index),
    ]
    
    
    # 视图函数里
    def index(request):
        return render(request,"index.html")

    CBV : class base views,  就是在视图里使用类处理请求。

    urlpatterns = [
        path("login/",views.LoginView.as_view())
    ]
    
    
    # 视图函数里
    class LoginView(View):
    
        def dispatch(self, request, *args, **kwargs):
            """
            重写dispatch方法, 可以放一些专属于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是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view(即Django的基础View类)提供了一个 as_view()  的静态方法(也就是类方法),调用这个方法,会通过  self = cls(**initkwargs)  创建一个类的实例,然后通过实例调用 dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)。到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。如果方法没有定义,会抛出HttpResponseNotAllowed异常。

    为什么要有CBV这种模式? 

      python的一大重要的特性就是面向对象。而cbv更能体现python的面向对象。cbv是通过class的方式来实现视图方法的。class相对于function,更能利用多态的特定(多态: 可对不同类的对象使用同样的操作),因此更容易从宏观层面上将项目内的比较通用的功能抽象出来。

  • 相关阅读:
    Membership和Role Providers
    浏览器兼容手册
    手机开发与测试的Firefox插件:User Agent Switcher
    控制input输入框的高度
    纯 CSS3 打造的按钮实例
    CSS对各个浏览器兼容
    网页配色的天然范儿
    Jquery的each里面用return false代替break; return ture 代替continue
    li标签float:left,IE6中第二行会空缺一块,ie8和FF正常,怎么解决?
    用XMLHTTP实现无刷新的与server通信
  • 原文地址:https://www.cnblogs.com/bk9527/p/10475605.html
Copyright © 2011-2022 走看看