详解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使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
深入浅出学习python装饰器
Sep 29 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
Python读取指定日期邮件的实例
Feb 01 Python
Python元组常见操作示例
Feb 19 Python
python爬虫实现中英翻译词典
Jun 25 Python
python 使用plt画图,去除图片四周的白边方法
Jul 09 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
Python assert关键字原理及实例解析
Dec 13 Python
Python列表解析操作实例总结
Feb 26 Python
python 基于卡方值分箱算法的实现示例
Jul 17 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
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
解析argc argv在php中的应用
2013/06/24 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
学习JavaScript图片预加载模块
2016/11/07 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
Python中常见的数据类型小结
2015/08/29 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
python实现批量注册网站用户的示例
2019/02/22 Python
opencv+python实现均值滤波
2020/02/19 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
什么是抽象
2015/12/13 面试题
机电专业个人自荐信格式模板
2013/09/23 职场文书
新郎婚宴答谢词
2014/01/19 职场文书
小学生评语集锦
2014/04/18 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
药店营业员岗位职责
2015/04/14 职场文书
闪闪的红星观后感
2015/06/08 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
交通事故协议书范本
2016/03/19 职场文书
Python实现socket库网络通信套接字
2021/06/04 Python