详解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 urlopen()函数 示例分享
Jun 12 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
Sep 08 Python
一文总结学习Python的14张思维导图
Oct 17 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
python求最大值最小值方法总结
Jun 25 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
python自定义函数def的应用详解
Jun 03 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
django form和field具体方法和属性说明
Jul 09 Python
python 实现汉诺塔游戏
Nov 28 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
python blinker 信号库
May 04 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
PHP设计模式之装饰者模式
2012/02/29 PHP
php中in_array函数用法探究
2014/11/25 PHP
php格式化金额函数分享
2015/02/02 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
JavaScript 高级语法介绍
2009/06/15 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
js获取form表单中name属性的值
2019/02/27 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
解决python Markdown模块乱码的问题
2019/02/14 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
python实现简单坦克大战
2020/03/27 Python
极简的HTML5模版
2015/07/09 HTML / CSS
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
MySQL批量更新不同表中的数据
2022/05/11 MySQL