美文网首页
Django之FBV和CBV(dispatch方法)

Django之FBV和CBV(dispatch方法)

作者: 楠木cral | 来源:发表于2019-02-20 21:49 被阅读0次

一、FBV与CBV
在我们日常学习Django中,都是用的FBV(function base views)方式,就是在视图中用函数处理各种请求。而CBV(class base view)则是通过类来处理请求。
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:

  1. 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
  2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
    二、两者区别
  3. fbv
fbv就是在url中一个路径对应一个函数
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index)
]

在视图函数中

def index(request):
    return render(request, 'index.html')
  1. cbv
    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'更新, 'patch'局部更新, 'delete'删除, 'head', 'options', 'trace'
参考:https://www.jianshu.com/p/a3e6217d7bee
三、diaspatch方法
所有支持类似CBV的框架,不限开发语言,都是基于反射来实现的,根据methods不同来执行不同的方法
CBV关键之处就是dispatch方法的使用
在Django里面的base.py中,写好了dispatch()来处理请求

image.png
我们能看到url访问的时候,会执行as_view()方法:
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.IndexView.as_view())     # 执行类后面的as_view()方法,是父类里面的方法
]

然后as_view在base.py中的view类里面


image.png

这里能看出执行as_view()时返回view会执行view方法,view方法又会调用dispatch方法(不管请求是什么都会执行dispatch),返回dispatch方法的返回值,这里

self = cls(**initkwargs)

这里的cls就是请求的类,把这个IndexView类实例化了


image.png

这里就是一个修饰器功能
我们可以通过重写dispatch方法来自定义处理请求:
在我们的写的IndexView类里面,重写dispatch()

class IndexView(View):
    def dispatch(self, request, *args, **kwargs):
        return HttpResponse("dispatch")
    
    def get(self,request,*args,**kwargs):
        return HttpResponse("GET")
    def post(self,request,*args,**kwargs):
        return HttpResponse("POST")
    def put(self,request,*args,**kwargs):
        return HttpResponse("PUT")
    def delete(self,request,*args,**kwargs):
        return HttpResponse("DELET")

根据上面写的代码,因为无论请求是什么都会执行dispatch方法,所以无论请求是什么都会返回“dispatch”,那么我们就可以在自己写的这个dispatch方法中自定义,根据请求类型执行什么操作。

class IndexView(View):
    def dispatch(self, request, *args, **kwargs):
        #
        func = getattr(self,request.method.lower)
        ret = func(request, *args, **kwargs)
        return ret

    def get(self,request,*args,**kwargs):
        return HttpResponse("GET")
    def post(self,request,*args,**kwargs):
        return HttpResponse("POST")
    def put(self,request,*args,**kwargs):
        return HttpResponse("PUT")
    def delete(self,request,*args,**kwargs):
        return HttpResponse("DELET")

这样就可以根据请求类型,用getattr判断,这里注意返回的request.method是大写的,需要小写。
当然这个dispatch在父类View写好了,不用我们写,这里用于理解源码中的dispatch方法

相关文章

  • Django之FBV和CBV(dispatch方法)

    一、FBV与CBV在我们日常学习Django中,都是用的FBV(function base views)方式,就是...

  • DRF进阶

    一、Django的FBV和CBV FBV:Function-base views基于函数的视图CBV:Class-...

  • django中的FBV和CBV

    django中请求处理方式有2种:FBV 和 CBV FBV FBV(function base views) 就...

  • Django-FBV 和 CBV

    FBV 和 CBV django中请求处理方式有2种: FBV(function base views)** 就是...

  • Django中的CBV

    django中请求处理方式有2种:FBV 和 CBV CBV CBV(class base views) 就是在视...

  • Django 的 cbv

    正如我们了解到的,Django 写视图函数有两种写法:cbv 和 fbv。cbv 提倡使用类来写,fbv 使用函数...

  • django笔记(四)视图

    FBV:基于方法的视图########################################## CBV...

  • Django的CBV和FBV

    django提供了两种对应关系。 views.py中就是使用的FBV。 urls.py中使用: CBV的方式: u...

  • django的FBV和CBV

    一 . 什么是FBV&CBV FBV -Function Base VIew CBV-Class Base Vie...

  • Django使用CBV处理请求

    在Django中有两种基本的处理用户请求的方式,分别是FBV和CBV,这里讲的是关于使用CBV处理用户请求的方式 ...

网友评论

      本文标题:Django之FBV和CBV(dispatch方法)

      本文链接:https://www.haomeiwen.com/subject/pbskyqtx.html