扩展类的流程分析:代码部分:
# 扩展类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 收到前端请求时执行上面的函数
|