详解Django中类视图使用装饰器的方式
作者:skaarl 发布时间:2023-12-20 15:35:57
标签:Django,类视图,装饰器
类视图使用装饰器
为类视图添加装饰器,可以使用两种方法。
为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。
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')
来源:http://www.cnblogs.com/skaarl/p/9456931.html
0
投稿
猜你喜欢
- 在安排Web页面的布局时,最常用的方法之一是用HTML表格界定页面的结构。例如,假设Web页面由顶端的
- import random, stringclass C(object): passdef danger
- 使用ASP做网站虽然有点落伍,但在中国还是有很大市场的,因为大部分国内用户使用Windows Server服务器,在Windows Serv
- 1.基于OpenCV的形状检测Python版本目录结构1.1.定义我们的形状检测器类ShapeDetector开始定义我们的 ShapeDe
- Silverlight也算一个比较开放的技术。Button控件其实也是一些标准的Grid、Canvas、Rectangle、TextBloc
- os.system()在shell中执行一条命令。函数原型如下:它是最简单的调用系统应用的方式,下面是一个例子:import osimpor
- 怎么样才能设计出漂亮的网页?怎么样才能做好网页设计工作,现在许多人还停留在网页制作的水平上,认为只要用好了网页制作软件,就能搞好网页设计了,
- 今天咱写一个挺实用的工具,就是扫描并获取可用的proxy首先呢,我先百度找了一个网站:http://www.xicidaili.com 作为
- Python 类的继承详解Python既然是面向对象的,当然支持类的继承,Python实现类的继承比JavaScript简单。Parent类
- 最近有同学询问如何利用Python处理xml文件,特此整理一个比较简洁的操作手册,供大家参阅。首先准备一个xml文件,xml中的内容如下所示
- 本文实例讲述了python有证书的加密解密实现方法。分享给大家供大家参考。具体实现方法如下:最近在做python的加解密工作,同时加完密的串
- 首先贴出四种方法适用范围比较:注释:Excel 2003 即XLS文件有大小限制即65536行256列,所以不支持大文件。而Excel 20
- 我就废话不多说了,大家还是直接看代码吧~#zmail库:可以用几行代码帮我们收取一封邮件import zmail#输入账号和密码server
- 这篇文章主要介绍了python字典setdefault方法和get方法使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定
- Python 3 利用 Dlib 19.7 实现摄像头人脸检测特征点标定0.引言利用python开发,借助Dlib库捕获摄像头中的人脸,进行
- choice()方法从一个列表,元组或字符串返回一个随机项。语法以下是choice()方法的语法:choice( seq )注意
- 本文由伯乐在线 - 敏捷翻译的史莉萍翻译自《Creating an Effective Color-Scheme for Web Desig
- 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛。在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都
- 在本教程中,你会学到如何把HTML的列表项(li元素)转换成下图的“便签墙”。该效果分5步实现。内核为webkit的Safari和Chrom
- 前2种方法主要用到了列表解析,性能稍差,而最后一种使用的时候生成器表达式,相比列表解析,更省内存列表解析和生成器表达式很相似:列表解析[ex