视图 CBV 和 FBV
什么是视图?
视图 CBV 和 FBV
什么是视图?
一个视图函数(类),简称视图,是一个简单的Python 函数(类), 它接受Web请求并且返回Web响应。 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档, 或者一张图片。放置在项目 (project)或应用程序(app)目录中的名为views.py的文件中。 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档, 或者一张图片。放置在项目 (project)或应用程序(app)目录中的名为views.py的文件中。
FBV
FBV(function base views) 就是在视图里使用函数处理请求。
在之前django的学习中,我们一直使用的是这种方式,所以不再赘述。
CBV
CBV(class base views) 就是在视图里使用类处理请求。
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:
Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)。到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。如果方法没有定义,会抛出HttpResponseNotAllowed异常。
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添加装饰器
如果有多个程序需要用户登录验证的话会造成代码冗余,可以使用继承很好的解决这个问题,但是还有更好的方法,那就是基于装饰器实现登录验证