这里先定义了两个扩展类(DecoratorMixin_one、DecoratorMixin_two)和两个装饰器(decorator_one、decorator_two)。再定义一个类 Class_Views继承自两个扩展类和View类;接下来将分析其继承顺序和装饰器装饰顺序。
(注:当DecoratorMixin_one,DecoratorMixin_two,View都继承自object时,Class_Views继承这三个类,则改变了原有的继承关系,目前继承关系变为:Class_Views>>DecoratorMixin_one>>DecoratorMixin_two>>View>>object;当Class_Views执行as_view()时,向上寻找DecoratorMixin_one中的as_view()方法,继续执行super().as_view(args,*kwargs)时,向上寻找DecoratorMixin_two的as_view()方法,而不会去object中寻找as_view()方法)
# 扩展类1
class DecoratorMixin_one(object):
@classmethod
def as_view(cls,*args,**kwargs):
print("调用扩展类1")
view = super().as_view(*args,**kwargs) #返回一个已经被装饰器2装饰后的视图函数
view = decorator_one(view) # 调用装饰器1对视图函数进行装饰
return view
# 扩展类2
class DecoratorMixin_two(object):
@classmethod
def as_view(cls, *args, **kwargs):
print("调用扩展类2")
view = super().as_view(*args, **kwargs) # 根据前端的请求方式返回相应的视图函数
view = decorator_two(view) # 调用装饰器2对返回的视图函数进行装饰
return view
# 装饰器1
def decorator_one(fnc):
def wrappr(request,*args,**kwargs):
print("调用装饰器1")
return fnc(request,*args,**kwargs)
return wrappr
# 装饰器2
def decorator_two(fnc):
def wrappr(request,*args,**kwargs):
print("调用装饰器2")
return fnc(request,*args,**kwargs)
return wrappr
class Class_Views(DecoratorMixin_one,DecoratorMixin_two,View):
def get(self,request):
print("GET方法")
return HttpResponse('类视图GET方式请求')
def post(self,request):
print("POST方法")
return HttpResponse('类视图POST方式请求')
# 路由定义
urlpatterns = [
url(r'^Class_Views/', views.Class_Views.as_view()),
]
扩展类的继承流程分析:
当开启服务器时会加载路由设置:
1、加载路由设置时执行Class_Views.as_view();
2、Class_Views类中无as_view()方法,则向上继承父类DecoratorMixin_one的as_view()方法;
3、执行DecoratorMixin_one的as_view()方法时打印:"调用扩展类1";继续向下执行view = super().as_view(args,*kwargs)时向上继承父类DecoratorMixin_two的as_view()方法。
4、执行DecoratorMixin_two的as_view()方法时打印:"调用扩展类2";继续向下执行view = super().as_view(args,*kwargs)时向上继承父类View的as_view()方法。
5 、执行View的as_view()方法后,根据前端的请求方式(GET,POST)返回相关的视图函数(get,post)。
6、当前在扩展类2中获得父类View返回的视图函数后继续向下执行:view = decorator_two(view),通过装饰器2对视图函数添加功能,返会一个添加功能后的新视图函数给扩展类1:如下
print("调用装饰器2")
def get(self,request):
print("GET方法")
return HttpResponse('类视图GET方式请求')
7、扩展类1获得返回新视图函数后继续向下执行view = decorator_one(view),将对新的视图函数通过装饰器1进行添加新功能,得到新的的视图函数如下:
print("调用装饰器1")
print("调用装饰器2")
def get(self,request):
print("GET方法")
return HttpResponse('类视图GET方式请求')
8、当前端页面发起请求时,执行上面被装饰器装饰后的get函数;