Django中扩展类的继承流程

这里先定义了两个扩展类(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函数;

你可能感兴趣的:(Django中扩展类的继承流程)