类视图使用装饰器

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

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

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')
		

方法一:在URL配置中装饰

urlpatterns = [
	url(r'^demo/$', my_decorator(DemoView.as_view()))
]

1.此种方式最简单,但因装饰行为被放置到了url配置中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。
2.此种方式会为类视图中的所有请求方法都加上装饰器行为(因为是在视图入口处,分发请求方式前)。

方法二:在类视图中装饰

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

from django.utils.decorator import method_decorator
#为全部请求方式添加装饰器
class DemoView(View):

	#使用name参数指明被装饰的方法
	#method_decorator的作用是为函数视图装饰器补充第一个self参数,以适配类视图方法。
	@method_decorator(my_decorator, name='dispatch')
	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。
代码如下:

def my_decorator(func):
	def wrapper(self, request, *args, **kwargs):
		print('自定义装饰器被调用了')
		print('请求路径%s' % request.path)
		return func(self, request, *args, **kwargs)
	return wrapper
	#下面代码省略

方法三:构造Mixin扩展类

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

class MyDeractorMixin(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')

使用Mixin扩展类,也会为类视图的所有请求方法都添加装饰行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值