所谓类视图就是用类定义的视图,其主要支持客户端在用不同的请求方式发起的HTTP请求。
首先,我们需要明确一下类视图的好处:
1.代码可读向高;
2.相对于视图函数具有更高的代码复用性;
3.便于维护。
类视图的定义格式如下:
# 1. 导入视图模块
from django.views.generic import View
class ObjectView(View): """2. 定义一个类视图"""
# 3.编写视图函数 def get(self, request): """处理GET请求""" return HttpResponse('以GET请求方式发起的HTTP请求') def post(self, request): """处理POST请求""" return HttpResponse('以POST请求方式发起的HTTP请求')
在类视图定义的时候我们需要注意一下几点:
1. 类视图必须继承View类;
2. 类视图中的方法必须以请求方式的小写形式来命名;
视图函数我们编写完了,那么接下我们就要配置路由了。
我们需要在子路由中添加上一下代码:
urlpatterns = [
# 视图函数:注册
# url(r'^index/$', views.index, name='index'),
# 类视图:注册
url(r'^index_get/$', views.ObjectView.as_view(), name='ObjectView'),
]
这里注意类视图一定要调用as_view()方法。
下面我来简述一下as_view()方法的执行流程:
1. 类视图在路由中调用as_view()方法,
2. as_view()方法语法上是一个闭包,它会调用它的内层函数view(),
3. view()会将请求的对象及参数接收,传递给dispatch()方法并调用dispatch()方法,
4. dispatch()方法会接收传递的参数,并且通过python中的底层函数getattr()获取到根据请求方式确定的类视图中的方法。
5. 最后再将方法的引用逐层返回,从而完成类视图中的方法的调用。
为类视图添加装饰器
装饰器对大家来说,我相信都不陌生,其原理我就不赘述了,
接下我会为大家简单介绍一下如何给类视图添加装饰器。
说到需要给类视图添加装饰器,那么第一步就是编写一个装饰器。
1.编写装饰器:
def decorator(func):
def inner(*args, **kwargs):
print('装饰内容1')
ret = func(*args, **kwargs)
print('装饰内容2')
return ret
return inner
既然装饰器编写完成,那么接下来我们就编写一个类视图。
2. 编写类视图:
class register2(View):
def get(self,request):
print('Classess GET Content')
return HttpResponse('Classess GET OK')
def post(self,request):
print('Classess POST Content')
return HttpResponse('Classess POST OK')
现在,我们所有需要的东西都已准备完毕了,万事俱备只欠添加了。
3. 给类视图添加装饰器:
为类视图添加装饰器,一共有三种方法,接下来我将会为大家简单介绍一下类视图添加装饰器的三种方法。
第一种方式给类视图添加装饰器:
# 第一种方式给类视图添加装饰器
# 1. 导入模块
from django.utils.decorators import method_decorator
# 2. 给类视图添加装饰器
@method_decorator(decorator,name='dispatch')
class register2(View):
pass
# 注意:
# 通过这种方式添加的装饰器,会给所有的方法添加上。
第二种方式给类视图添加装饰器:
# 第二种方式给类视图添加装饰器
# 1. 导入模块
from django.utils.decorators import method_decorator
# 2. 给类视图添加装饰器
@method_decorator(decorator, name='get')
class registter2(View):
pass
# 注意:
# 通过此方式添加的装饰器,会给类视图中指定的方法添加上。
第三种方式给类视图添加装饰器:
# 第三种方式给类视图添加装饰器
# 1. 导入模块
from django.utils.decorators import method_decorator
# 2. 给类视图添加装饰器
class register2(View):
@method_decorator(decorator)
def get(self,reqeust):
return HttpResponse('Is ok ')
def post(self,reqeust):
return HttpResponse('Is ok ')
# 注意:
# 通过此方式可以给类中的多个方法添加装饰器
类视图的扩展:
类视图的扩展,直白点说就是类的继承,将所有重复的代码,封装到一个工具类中,然后通过继承这个工具类,就可以直接调用这些封装好的属性或方法了。
# 扩展类的命名一般以 Mixin 结尾 class CreateMixin(object): def create(self,request,*args,**kwargs): print('Create Mixin Run ...') return HttpResponse('Create') class ListMixin(object): def lister(self,request,*args ,**kwargs): print('List Mixin Run ...') return HttpResponse('List') class IndexView(CreateMixin, ListMixin, View): def get(self,request): resp = self.create(request) resp.content = str(resp.content.decode()) + ' Index' print('Get Run ..') return resp def post(self,request): print('POST Run ..') return self.lister(request)