django cbv fbv,Django跟drf的区别
FBVFBV(function base views)是使用视图中的函数来处理请求。
在之前对django的研究中,我们一直在用这个方法,这里就不赘述了。
CBVCBV(class base views)是使用视图中的类来处理请求。
Python是一种面向对象的编程语言。如果只靠函数开发,就会错过面向对象的很多优点(继承、封装、多态)。所以Django后来加入了基于类的观点。让我们在课堂上写视图。这样做的优点如下:
提高了代码的可重用性,可以使用面向对象技术。比如Mixin(多重继承)可以针对不同的HTTP方法用不同的函数来处理,而不用做很多if判断,从而提高代码的可读性。
使用基于类的视图如果我们想写一个处理GET方法的视图,如果是用函数写的话如下。
从django.http导入HttpResponse
定义我的视图(请求):
if request.method==GET :
Return HttpResponse(OK ),如果用基于类的视图编写,如下。
从django.http导入HttpResponse
从django.views导入视图
类MyView(视图):
def get(自身,请求):
返回HttpResponse(“确定”)
Django的url将请求分配给一个可调用的函数,而不是一个类。为了解决这个问题,基于类的视图提供了一个静态方法as_view()(即类方法)。调用此方法时,将创建该类的一个实例,然后通过该实例调用dispatch()方法。dispatch()方法会调用相应的方法来处理请求(比如get()、post()等。)根据请求的方法不同。在这一点上,这些方法类似于基于函数的视图。要接收请求,请获取响应返回。如果该方法未定义,将引发HttpResponseNotAllowed异常。
在url中,就像这样写:
# urls.py
从django.conf.urls导入url
从myapp.views导入MyView
urlpatterns=[
url(r^index/$,MyView.as_view()),
]
可以通过两种方式设置类的属性。第一个是常见的Python方法,它可以被子类覆盖。
从django.http导入HttpResponse
从django.views导入视图
班级欢迎视图(视图):
name=袁
def get(自身,请求):
返回HttpResponse(self.name)
#您可以在子类中覆盖它
类morning greeting view(greeting view):
name=亚历克斯
第二种方法,你也可以在url中指定类的属性:
在url中设置类的属性Python
urlpatterns=[
url(r^index/$,greeting view . as _ view(name= egon ),
]
使用Mixin,我觉得要理解django的class-based-view(以下简称cbv),首先要明白django引入cbv的目的是什么。django1.3之前的generic view,即所谓的通用视图,使用的是function-based-view(fbv),即基于函数的视图。有些人认为fbv比cbv更pythonic,但他们不这么认为。python的一个重要特点是面向对象。而cbv更能体现python的面向对象。Cbv通过类的方式实现view方法。与函数相比,类可以更好地利用多态的特异性,因此更容易从宏观层面抽象出项目中的通用函数。关于多态性,我不多解释了。感兴趣的同学自己谷歌一下。总之,可以理解为一个事物有多种形态。看一下django的源代码就很容易理解cbv的实现原理。一般url路由到这个cbv后,通过cbv的内部调度方法进行分发,get请求分发到cbv.get方法进行处理,post请求分发到cbv.post方法进行处理。其他方法类似。如何利用多态性?cbv中引入了mixin的概念。mixin是一些已经写好的基础类,然后通过不同的mixin组合成最终想要的类。
所以理解cbv的基础是理解Mixin。Django中使用Mixins来重用代码。一个视图类可以继承多个mixins,但只能继承一个视图(包括它的子类)。建议最右边写View,左边写multiple mixins。
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。