详解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开发编码规范
Sep 08 Python
python实现代码行数统计示例分享
Feb 10 Python
跟老齐学Python之从格式化表达式到方法
Sep 28 Python
Python 两个列表的差集、并集和交集实现代码
Sep 21 Python
解决python报错MemoryError的问题
Jun 26 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
pandas统计重复值次数的方法实现
Feb 20 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定时任务获取微信access_token的方法
2016/10/10 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
python写一个md5解密器示例
2018/02/23 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
用python计算文件的MD5值
2020/12/23 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
strstr()的简单实现
2013/09/26 面试题
大学毕业生的自我鉴定
2013/11/30 职场文书
高中同学聚会邀请函
2014/01/11 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android
MySQL RC事务隔离的实现
2022/03/31 MySQL
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python