详解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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
python算法学习之基数排序实例
Dec 18 Python
python里对list中的整数求平均并排序
Sep 12 Python
django 发送手机验证码的示例代码
Apr 25 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
python opencv实现图像边缘检测
Apr 29 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
在Python中实现字典反转案例
Dec 05 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
python析构函数用法及注意事项
Jun 22 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
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
python生成器generator用法实例分析
2015/06/04 Python
Python脚本按照当前日期创建多级目录
2019/03/01 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
前台领班岗位职责
2013/12/04 职场文书
财务部经理岗位职责
2014/02/03 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
电子商务求职信
2014/06/15 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python