为类视图添加装饰器,可以使用两种方法。
为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def my_decorator(func): def wrapper(request, * args, * * kwargs): print ( '自定义装饰器被调用了' ) print ( '请求路径%s' % request.path) return func(request, * args, * * kwargs) return wrapper class DemoView(View): def get( self , request): print ( 'get方法' ) return HttpResponse( 'ok' ) def post( self , request): print ( 'post方法' ) return HttpResponse( 'ok' ) |
4.1 在URL配置中装饰
1
2
3
|
urlpatterns = [ url(r '^demo/$' , my_decorate(DemoView.as_view())) ] |
此种方式最简单,但因装饰行为被放置到了url配置中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。
此种方式会为类视图中的所有请求方法都加上装饰器行为(因为是在视图入口处,分发请求方式前)。
4.2 在类视图中装饰
在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。
method_decorator装饰器使用name参数指明被装饰的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 为全部请求方法添加装饰器 @method_decorator (my_decorator, name = 'dispatch' ) class DemoView(View): def get( self , request): print ( 'get方法' ) return HttpResponse( 'ok' ) def post( self , request): print ( 'post方法' ) return HttpResponse( 'ok' ) # 为特定请求方法添加装饰器 @method_decorator (my_decorator, name = 'get' ) class DemoView(View): def get( self , request): print ( 'get方法' ) return HttpResponse( 'ok' ) def post( self , request): print ( 'post方法' ) return HttpResponse( 'ok' ) |
如果需要为类视图的多个方法添加装饰器,但又不是所有的方法(为所有方法添加装饰器参考上面例子),可以直接在需要添加装饰器的方法上使用method_decorator,如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from django.utils.decorators import method_decorator # 为特定请求方法添加装饰器 class DemoView(View): @method_decorator (my_decorator) # 为get方法添加了装饰器 def get( self , request): print ( 'get方法' ) return HttpResponse( 'ok' ) @method_decorator (my_decorator) # 为post方法添加了装饰器 def post( self , request): print ( 'post方法' ) return HttpResponse( 'ok' ) def put( self , request): # 没有为put方法添加装饰器 print ( 'put方法' ) return HttpResponse( 'ok' ) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/skaarl/p/9456931.html