详解Django中类视图使用装饰器的方式


Posted in Python onAugust 12, 2018

类视图使用装饰器

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
Aug 25 Python
跟老齐学Python之Import 模块
Oct 13 Python
Python操作MySQL简单实现方法
Jan 26 Python
详解Python中heapq模块的用法
Jun 28 Python
火车票抢票python代码公开揭秘!
Mar 08 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
Python3中exp()函数用法分析
Feb 19 Python
python实现弹窗祝福效果
Apr 07 Python
python面试题之列表声明实例分析
Jul 08 Python
Python实现计算对象的内存大小示例
Jul 10 Python
Python queue队列原理与应用案例分析
Sep 27 Python
python中pip的安装与使用教程
Aug 10 #Python
python3判断url链接是否为404的方法
Aug 10 #Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 #Python
Selenium元素的常用操作方法分析
Aug 10 #Python
Selenium定位元素操作示例
Aug 10 #Python
判断python字典中key是否存在的两种方法
Aug 10 #Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 #Python
You might like
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
PHP 实例化类的一点摘记
2008/03/23 PHP
PHP 危险函数全解析
2009/09/09 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
c++生成dll使用python调用dll的方法
2014/01/20 Python
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
python实现定制交互式命令行的方法
2014/07/03 Python
python中global用法实例分析
2015/04/30 Python
python 实时遍历日志文件
2016/04/12 Python
Python查询IP地址归属完整代码
2017/06/21 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
python实现数据库跨服务器迁移
2018/04/12 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
停车场管理协议书范本
2014/10/08 职场文书
超市工作总结范文2014
2014/12/19 职场文书
烈士陵园观后感
2015/06/08 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python