A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© IT-hanpeng 初级黑马   /  2019-5-31 19:02  /  823 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

扩展类的流程分析:代码部分:
# 扩展类1
class DecoratorMixin(object):
    @classmethod
    def as_view(cls,*args,**kwargs):
        print("调用扩展类1")
        view = super().as_view(*args,**kwargs) #返回一个已经被装饰器2装饰后的视图函数
        view = decorator(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(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,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、当开启服务器时会加载路径:
        1.1 加载路径时执行Class_Views.as_view();
        1.2 Class_Views类中无as_view()方法,则向上继承父类DecoratorMixin的as_view()方法;
        1.3 执行DecoratorMixin的as_view()方法时打印:"调用扩展类1";继续向下执行view = super().as_view(*args,**kwargs),向上继承父类DecoratorMixin_two的as_view()方法。
        1.4 执行DecoratorMixin_two的as_view()方法时打印:"调用扩展类2";继续向下执行view = super().as_view(*args,**kwargs),向上继承父类View的as_view()方法。
        1.5 执行View的as_view()方法后,根据前端的请求方式(GET,POST)返回相关的视图函数(get,post),
        1.6 当前在扩展类2中获得父类返回的视图函数后继续向下执行:view = decorator_two(view),通过装饰器2对视图函数添加功能,返会一个添加功能后的新视图函数给扩展类1:如下print("调用装饰器2")
def get(self,request):
        print("GET方法")
        return HttpResponse('类视图GET方式请求')
1.7 扩展类1获得返回新视图函数后继续向下执行view = decorator(view),将对新的视图函数通过装饰器1进行添加新功能,得到新的的视图函数如下:收到前端请求时执行下面的函数print("调用装饰器1")
print("调用装饰器2")
def get(self,request):
        print("GET方法")
        return HttpResponse('类视图GET方式请求')
1.8 收到前端请求时执行上面的函数



1 个回复

倒序浏览
这是高手
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马