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')Django中类视图使用装饰器的方式的更多相关文章
- django类视图的装饰器验证
		django类视图的装饰器验证 django类视图的get和post方法是由View内部调用dispatch方法来分发,最后调用as_view来完成一个视图的流程. 函数视图可以直接使用对应的装饰器 ... 
- Django:(05)类视图,装饰器和中间件
		一.类视图的定义和使用 在Django中还可以通过类来定义一个视图,称为类视图. 定义一个类视图:定义一个类,需继承 Django 提供的 View 类 . from django.views.gen ... 
- Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传
		Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传 一丶CBV和FBV 在Django中存 ... 
- django 内置用户-装饰器
		""" 一.如何给python内置用户添加额外的字段,注意一定义在没有迁移数据之前定义,否则会报错 1.在models中先调用 from django.contrib.a ... 
- pyqt5界面与逻辑分离--信号槽的装饰器实现方式
		本文展示了 pyqt5 信号槽的装饰器实现方式(借鉴自 eirc6) 一个简单的例子.实现功能:两个数相加,显示结果.如图 两个文件,第一个是界面文件 ui_calc.py # ui_calc.py ... 
- Django基础之给视图加装饰器
		1. 使用装饰器装饰FBV FBV本身就是一个函数,所以和给普通的函数加装饰器无差: def wrapper(func): def inner(*args, **kwargs): start_time ... 
- Django学习手册 - 登录装饰器
		# 装饰器定义 def auth(func): def inner(request,*args,**kwargs): v = request.COOKIES.get("user") ... 
- Django-给视图加装饰器
		给FBV加装饰器 FBV:function based view FBV本身就是一个函数,所以跟普通函数加装饰器是一样的 # 装饰函数是要在APP文件中定义,本例是在app01\templatetag ... 
- django ----CBV中加装饰器
		CBV中加装饰器 from django import views from django.utils.decorators import method_decorator def login_aut ... 
随机推荐
- C/C++结构体总结
			1 #include"iostream" 2 using namespace std; 3 4 struct TestStruct 5 { 6 ... 
- MVC中 关于退出按钮的写法
			public ActionResult Logoff() { Session.Abandon(); Session.Clear(); FormsAuthentication.SignOut(); re ... 
- spring手动配置
			本文总结自:https://www.cnblogs.com/V1haoge/p/7183408.html SpringBoot中免除了大部分配置,但是对于一些特定的情况,还是需要我们进行手动配置的. ... 
- RocEDU.阅读.写作《苏菲的世界》书摘(二)
			"迷信",多么奇怪的一个名词.如果你信基督教或伊斯兰教,这就叫"信仰",但如果你相信占星术或十三号星期五不吉利,就是迷信.谁有权利说别人相信的东西就是" ... 
- 算法学习 - ST表 - 稀疏表 - 解决RMQ问题
			2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ... 
- [转]3个著名加密算法(MD5、RSA、DES)的解析
			MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来. ... 
- awardRotate.js
			(function($) { var supportedCSS,styles=document.getElementsByTagName("head")[0].style,toCh ... 
- input实现文件上传
			input实现文件上传 input + ajax 实现文件上传,包括文件大小及类型的判断 一.html <input type="file" id="file&qu ... 
- 【Linux】结合Python 简易实现监控公司网站,邮件发送异常
			背景 由于一些原因,博主负责测试的网站的服务器切换到了香港,切换后出现了多次访问超时的情况 于是主动请缨写一个自动监测的脚本,本来准备完全使用shell来写,后来发现shell发送邮件只能在测试机之间 ... 
- css实现标题文字过长截取...
			css实现网页中文字过长截取... title class应该这样写: .title{ width:300px; white-space:nowrap; overflow:hidden; text-o ... 
