详解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对html代码进行escape编码的方法
May 04 Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 Python
Python3中的真除和Floor除法用法分析
Mar 16 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
python 对象和json互相转换方法
Mar 22 Python
Python实现修改文件内容的方法分析
Mar 25 Python
对python指数、幂数拟合curve_fit详解
Dec 29 Python
python 矢量数据转栅格数据代码实例
Sep 30 Python
Python StringIO如何在内存中读写str
Jan 07 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
Python如何用re模块实现简易tokenizer
May 02 Python
Python时间操作之pytz模块使用详解
Jun 14 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
默默简单的写了一个模板引擎
2007/01/02 PHP
理解PHP5中static和const关键字的区别
2007/03/19 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
Python 对象中的数据类型
2017/05/13 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
办理居住证介绍信
2014/01/15 职场文书
目标责任书格式范文
2015/05/11 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
门面租赁合同范文
2019/08/06 职场文书