在django如何给CBV添加装饰器?

在Django中,给CBV添加装饰器有几种方式?

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

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

一、添加装饰器的方法

# urls.py
urlpatterns = [
 
    path("login/",views.Mydecorator(views.MyView.as_view())),
]


# views.py

def Mydecorator(func):
    def wrapper(*args,**kwargs):
        print('你被装饰器装饰啦!')
        res = func(*args,**kwargs)
        return res
    return wrapper

# @method_decorator(Mydecorator,name="post")
# @method_decorator(Mydecorator,name="get")
class MyView(View):
    # @method_decorator(Mydecorator)
    def get(self,request):
        return HttpResponse("get请求")

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

   在url中进行添加装饰器。

 

二、添加装饰器的方法

def Mydecorator(func):
    def wrapper(*args,**kwargs):
        print('你被装饰器装饰啦!')
        res = func(*args,**kwargs)
        return res
    return wrapper

@method_decorator(Mydecorator,name="post")
@method_decorator(Mydecorator,name="get")
class MyView(View):
    # @method_decorator(Mydecorator)
    def get(self,request):
        return HttpResponse("get请求")

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

  通过装饰视图类,name="函数名称"。

三、添加装饰器的方法

如果需要为类视图的多个方法添加装饰器,但又不是所有的方法(为所有方法添加装饰器参考上面例子),也可以直接在需要添加装饰器的方法上使用method_decorator(就是为指定方法添加装饰器),如下所示:

def Mydecorator(func):
    def wrapper(*args,**kwargs):
        print('你被装饰器装饰啦!')
        res = func(*args,**kwargs)
        return res
    return wrapper

# @method_decorator(Mydecorator,name="post")
# @method_decorator(Mydecorator,name="get")
class MyView(View):
    @method_decorator(Mydecorator)
    def get(self,request):
        return HttpResponse("get请求")

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

  

 

posted on 2022-12-06 16:29  一先生94  阅读(53)  评论(0编辑  收藏  举报

导航