method_decorator的作用以及使用方法

Posted J哥.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了method_decorator的作用以及使用方法相关的知识,希望对你有一定的参考价值。

为Django类视图添加装饰器

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

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

第一种添加装饰器的方法

# 在想要加装饰器的类的 应用中 
# views.py
def my_decorator(view_func):
    """定义装饰器"""
    def wrapper(request, *args, **kwargs):
        print("装饰器被调用了")
		return view_func(request, *args, **kwargs)
    return warpper
class DemoView(View):
    def get(request):
        return HttpResponse("get请求")

    def post(request):
        return HttpResponse("pose请求")
# url.py

url(r'^demo/$', views.my_decorator(view.DemoView.as_view()))

第二种添加装饰器的方法

# views.py
def my_decorator(view_func):
    """定义装饰器"""
    def wrapper(request, *args, **kwargs):
        print("装饰器被调用了")
		return view_func(request, *args, **kwargs)
    return warpper

# 为全部请求方法添加装饰器
# method_decorator的作用是为函数视图装饰器补充第一个self参数,以适配类视图方法。
@method_decorator(my_decorator, name='dispatch')
class DemoView(View):
    def get(self, request):
        return HttpResponse("get请求")

    def post(self, request):
        return HttpResponse("pose请求")


# 为特定请求方法添加装饰器
@method_decorator(my_decorator, name='get')
class DemoView(View):
    def get(self, request):
        return HttpResponse("get请求")

    def post(self, request):
        return HttpResponse("pose请求")

# urls
url(r'^demo/$', view.DemoView.as_view())

第三种添加装饰器的方法

如果需要为类视图的多个方法添加装饰器,但又不是所有的方法(为所有方法添加装饰器参考上面例子),也可以直接在需要添加装饰器的方法上使用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')

以上是关于method_decorator的作用以及使用方法的主要内容,如果未能解决你的问题,请参考以下文章

django 基于类的视图是不是继承 method_decorators?

@method_decorator 带有 login_required 和 permission_required

Django进阶篇

类视图使用装饰器

(django)11类视图

Django中间件