详解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 14 Python
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
Python实现简单的语音识别系统
Dec 13 Python
对Python2与Python3中__bool__方法的差异详解
Nov 01 Python
python绘制中国大陆人口热力图
Nov 07 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
详解Python中string模块除去Str还剩下什么
Nov 30 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
神族 Protoss 历史背景
2020/03/14 星际争霸
php正则校验用户名介绍
2008/07/19 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
js 数据类型转换总结笔记
2011/01/17 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
python处理文本文件并生成指定格式的文件
2014/07/31 Python
Python实现一个简单的MySQL类
2015/01/07 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
通过Pandas读取大文件的实例
2018/06/07 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
科室工作的个人自我评价
2013/10/30 职场文书
大四毕业生学习总结的自我评价
2013/10/31 职场文书
应届大学生求职信
2014/07/20 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
赢在执行观后感
2015/06/16 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python