详解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中运行并行任务技巧
Feb 26 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
Python中optparser库用法实例详解
Jan 26 Python
Python使用Django实现博客系统完整版
Sep 29 Python
PyQt5每天必学之进度条效果
Apr 19 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
pyQT5 实现窗体之间传值的示例
Jun 20 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
Mar 04 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 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
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
PHP编写RESTful接口
2016/02/23 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
vue模式history下在iis中配置流程
2019/04/17 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
在Python中使用dict和set方法的教程
2015/04/27 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
中间件分为哪几类
2016/09/18 面试题
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
公司综合部的成员自我评价分享
2013/11/05 职场文书
执行总经理岗位职责
2014/02/03 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android