详解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实现检测服务器是否可以ping通的2种方法
Jan 01 Python
Python实现Const详解
Jan 27 Python
python中随机函数random用法实例
Apr 30 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
在pycharm中实现删除bookmark
Feb 14 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
如何搭建pytorch环境的方法步骤
May 06 Python
Python中关于logging模块的学习笔记
Jun 03 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 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 多维数组排序(usort,uasort)
2010/06/30 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
js转换对象为xml
2017/02/17 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
Python 控制终端输出文字的实例
2019/07/12 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
pycharm配置git(图文教程)
2019/08/16 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
GWT的应用有哪两种部署模式
2012/12/21 面试题
高中学生期末评语
2014/04/25 职场文书
运动会口号16字
2014/06/07 职场文书
护士医德医风自我评价
2014/09/15 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
2014年小学工作总结
2014/11/26 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
先进学校事迹材料
2014/12/30 职场文书
死亡诗社观后感
2015/06/05 职场文书
装修安全责任协议书
2016/03/22 职场文书