前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django装饰器的使用 (类视图)

Django装饰器的使用 (类视图)

作者头像
kirin
发布于 2021-02-04 08:03:28
发布于 2021-02-04 08:03:28
1.1K00
代码可运行
举报
文章被收录于专栏:Kirin博客Kirin博客
运行总次数:0
代码可运行

4 类视图使用装饰器

为类视图添加装饰器,可以使用三种方法。

为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

 
  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配置中装饰

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
 
 
  
 
  url(r’^demo/$’, my_decorate(DemoView.as_view()))
 
 
  
 
  ]

此种方式最简单,但因装饰行为被放置到了url配置中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。

此种方式会为类视图中的所有请求方法都加上装饰器行为(因为是在视图入口处,分发请求方式前)。

4.2 在类视图中装饰

在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.utils.decorators import method_decorator
 
 
  
 
  
 
 
  
 
  # 为全部请求方法添加装饰器
 
 
  
 
  class DemoView(View):
 
 
  
 
  
 
 
  
 
   @method_decorator(my_decorator)
 
 
  
 
  def dispatch(self, *args, **kwargs):
 
 
  
 
   return super().dispatch(*args, **kwargs)
 
 
  
 
  
 
 
  
 
  def get(self, request):
 
 
  
 
  print(get方法’)
 
 
  
 
   return HttpResponse(‘ok’)
 
 
  
 
  
 
 
  
 
  def post(self, request):
 
 
  
 
  print(‘post方法’)
 
 
  
 
   return HttpResponse(‘ok’)
 
 
  
 
  
 
 
  
 
  
 
 
  
 
  # 为特定请求方法添加装饰器
 
 
  
 
  class DemoView(View):
 
 
  
 
  
 
 
  
 
   @method_decorator(my_decorator)
 
 
  
 
  def get(self, request):
 
 
  
 
  print(get方法’)
 
 
  
 
   return HttpResponse(‘ok’)
 
 
  
 
  
 
 
  
 
  def post(self, request):
 
 
  
 
  print(‘post方法’)
 
 
  
 
   return HttpResponse(‘ok’)

method_decorator装饰器还支持使用name参数指明被装饰的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  # 为全部请求方法添加装饰器
 
 
  
 
  @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???

为函数视图准备的装饰器,其被调用时,第一个参数用于接收request对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   def my_decorate(func):
 
 
  
 
   def wrapper(request, *args, **kwargs): # 第一个参数request对象 
 
 
  
 
  …代码省略…
 
 
  
 
   return func(request, *args, **kwargs)
 
 
  
 
   return wrapper
 

 
 

而类视图中请求方法被调用时,传入的第一个参数不是request对象,而是self 视图对象本身,第二个位置参数才是request对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  
 
  class DemoView(View):
 
 
  
 
   def dispatch(self, request, *args, **kwargs):
 
 
  
 
  …代码省略…
 
 
  
 
  
 
 
  
 
   def get(self, request):
 
 
  
 
  …代码省略…
 
 

所以如果直接将用于函数视图的装饰器装饰类视图方法,会导致参数传递出现问题。

method_decorator的作用是为函数视图装饰器补充第一个self参数,以适配类视图方法。

如果将装饰器本身改为可以适配类视图方法的,类似如下,则无需再使用method_decorator。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

 
   def my_decorator(func):
 
 
  
 
   def wrapper(self, request, *args, **kwargs): # 此处增加了self 
 
 
  
 
  print(‘自定义装饰器被调用了’)
 
 
  
 
  print(‘请求路径%s’ % request.path)
 
 
  
 
   return func(self, request, *args, **kwargs) # 此处增加了self 
 
 
  
 
   return wrapper
 
 

4.3 构造Mixin扩展类

使用面向对象多继承的特性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

  class MyDecoratorMixin(object):
 
 
  
 
   @classmethod
 
 
  
 
  def as_view(cls, *args, **kwargs):
 
 
  
 
  view = super().as_view(*args, **kwargs)
 
 
  
 
  view = my_decorator(view)
 
 
  
 
   return view
 
 
  
 
  
 
 
  
 
  class DemoView(MyDecoratorMixin, View):
 
 
  
 
  def get(self, request):
 
 
  
 
  print(get方法’)
 
 
  
 
   return HttpResponse(‘ok’)
 
 
  
 
  
 
 
  
 
  def post(self, request):
 
 
  
 
  print(‘post方法’)
 
 
  
 
   return HttpResponse(‘ok’)
 
 
 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django框架学习(二)
2、如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
小闫同学啊
2019/07/18
6720
Django框架学习(二)
Django实战-信息资讯-CMS后台管理-中
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/07/18
6310
Django实战-信息资讯-CMS后台管理-中
django的类视图-11
使用函数方式定义的视图叫函数视图,虽然使用方便,便于理解,但是当一个s视图有多种请求方式的时候,变需要使用分支来编写不同请求方式对应的逻辑。
py3study
2020/01/19
7910
CBV加装饰器
导入:from django.utils.decorators import method_decorator
HammerZe
2022/03/25
2460
03.Django基础三之视图函数
  一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
changxin7
2019/09/29
5K0
03.Django基础三之视图函数
django框架菜鸟教程_django框架菜鸟教程
reverse反解析 使用reverse函数,可以根据路由名称,返回具体的路径,如: from django.urls import reverse # 注意导包路径
全栈程序员站长
2022/10/05
3.2K0
Django之视图层与模板层
视图函数(类)简称为视图,就是一个普通的函数(类),它的功能是接收web请求,并返回web响应.
GH
2019/12/16
9.3K0
Django学习笔记之Django视图View
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。 无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。 一个简单的视图 下面是一个以HTML文
Jetpropelledsnake21
2018/07/04
1.9K0
不会DRF?源码都分析透了确定不来看?
目录 不会DRF?源码都分析透了确定不来看? 快速使用DRF写出接口 序列化和反序列化 drf快速使用 views.py serializer.py urls.py 在settings的app中注册 models.py postman测试 CBV源码流程分析 Django View和DRF APIView的小插曲 DRF之APIView和Request对象分析 APIView的执行流程 Request对象分析 原来的django中没有request.data,造一个! 不会DRF?源码都分析透了确定不来看?
HammerZe
2022/05/09
1.3K0
不会DRF?源码都分析透了确定不来看?
Django之views系统
Django的View(视图)简介 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。 无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。 一
人生不如戏
2018/04/12
2.3K0
Django之views系统
Django 视图 之FBV与CBV
基于类的视图,就是使用了类来处理用户的请求,不同的请求我们可以在类中使用不同方法来处理,这样大大的提高了代码的可读性;
HammerZe
2022/03/25
3780
Django 视图 之FBV与CBV
Django(23)Django限制请求装饰器
有时候,我们想要限制访问的请求方法,比如我们希望用户只能通过get方式请求,post不允许,那么我们可以采用装饰器的方式,django已经为我们提供了内置的装饰器
全栈程序员站长
2022/09/16
7000
Python进阶33-Django cookie和session
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
6910
Python进阶33-Django cookie和session
Django&DRF重点内容大盘点
本文只是将学习过程中需要深刻记忆,在工作中常用的一些命令或者知识点进行一个罗列并阐释,不会全面的将所有内容进行讲解。大家可以在了解了Django框架和DRF框架之后再来看这篇文章。否则会有点不知所云。
小闫同学啊
2019/07/18
6K0
Cookie和Session
cookie Cookie的由来 大家都知道HTTP协议是无状态的。 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此cookie就是在这样一个场景下诞生。 什么是co
人生不如戏
2018/04/12
9740
Cookie和Session
Cookie、Session
无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
py3study
2020/01/19
1K0
Cookie、Session
10.Django基础八之cookie和session
我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向10086发出多个请求,那么这多个请求都在一个会话中。 客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。
changxin7
2019/09/30
8540
10.Django基础八之cookie和session
python 终极篇 --- django
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
py3study
2020/01/19
1.7K0
python 终极篇 --- django
python测试开发django-73.django视图 CBV 和 FBV
FBV(function base views) 就是在视图里使用函数处理请求,这一般是学django入门的时候开始使用的方式。 CBV(class base views) 就是在视图里使用类处理请求,这是面向对象的编程方式。
上海-悠悠
2019/12/05
5480
Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09
django 中间件 就类似于是 django 的门户,请求来的时候需要先经过 中间件 才能到达 django 后端(urls),响应走的时候也需要经过 中间件 才能到达 web服务网关接口(wsgif 模块)
suwanbin
2019/09/27
1.4K0
Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09
相关推荐
Django框架学习(二)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验