类视图使用装饰器

为类视图添加装饰器,可以使用两种方法。

为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。

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配置中装饰

urlpatterns = [
url(r'^demo/$', my_decorate(DemoView.as_view()))
]

此种方式最简单,但因装饰行为被放置到了url配置中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。

此种方式会为类视图中的所有请求方法都加上装饰器行为(因为是在视图入口处,分发请求方式前)。

4.2 在类视图中装饰

在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。

method_decorator装饰器使用name参数指明被装饰的方法

# 为全部请求方法添加装饰器
@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,如下所示

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')

最新文章

  1. PhpStorm创建Drupal模块项目开发教程(3)
  2. ORACLE存储过程创建失败,如何查看其原因
  3. iOS 应用中有页面加载gif动画,从后台进入前台时就消失了
  4. iOS sqlite3 的基本使用(增 删 改 查)
  5. 使用dwr时动态生成table的一个小技巧
  6. struts 拦截器 Interceptor
  7. nrf51822裸机教程-RTC
  8. 基本 linux命令
  9. 测试通过Word直接发布博文
  10. css3背景总结与解析
  11. boost function对象
  12. 左右db_block_size了解和实验
  13. 移动端吸顶(iOS与安卓)
  14. Python 图片转字符画
  15. [LeetCode] Relative Ranks 相对排名
  16. 最简单的视频网站(JavaEE+FFmpeg)
  17. asp.net执行顺速
  18. Joseph POJ - 1012 约瑟夫环递推
  19. Linux 如何通过命令查看一个文件的某几行(中间几行或最后几行)
  20. ios开发之--NSString中substringFromIndex,substringWithRange,substringToIndex方法的使用

热门文章

  1. netty9---使用编码解码器
  2. JS答辩习题
  3. Apache 部署HTTPS
  4. Python基本数据类型之列表
  5. php下获取http状态的实现代码
  6. MR案例:WordCount改写
  7. Axis.Labels.CustomSize
  8. scrapy之手机app抓包爬虫
  9. NPM Scripts -- onchange parallelshell
  10. 如何选择正确的angular2学习曲线?