• Django:类视图的装饰器


    装饰器可以应用在视图函数上,同样也可以应用在视图类上。

    不过有一点小区别。

    用法一,在URLConf中直接装饰:

    from django.contrib.auth.decorators import login_required, permission_required
    from django.views.generic import TemplateView
    
    from .views import VoteView
    
    urlpatterns = [
        path('about/', login_required(TemplateView.as_view(template_name="secret.html"))),
        path('vote/', permission_required('polls.can_vote')(VoteView.as_view())),
    ]

    用法二,在类视图中装饰指定的方法:

    from django.contrib.auth.decorators import login_required
    from django.utils.decorators import method_decorator
    from django.views.generic import TemplateView
    
    class ProtectedView(TemplateView):
        template_name = 'secret.html'
    
        @method_decorator(login_required)
        def dispatch(self, *args, **kwargs):
            return super().dispatch(*args, **kwargs)

    注意:

    • 上面要把装饰器用在dispatch这个方法上,才能在每次请求到达URL时,实例化类视图时都运行这个装饰器的功能。
    • 不是每个装饰器都能直接运用在类方法上,需要使用method_decorator这个装饰器的装饰器方法将装饰器运用在类方法上。感觉很绕?其实就是说,我们有很多很多的装饰器,但其中有一些不能直接装饰dispatch这种类方法。那怎么办呢?套层壳!用method_decorator装饰器包裹起来,假装成一个能用的。

    有时候,简单地用一下,可以写成下面的精简版:

    @method_decorator(login_required, name='dispatch')
    class ProtectedView(TemplateView):
        template_name = 'secret.html'

    有时候,可能你需要对一个对象应用多个装饰器,正常做法是:

    @method_decorator(never_cache, name='dispatch')
    @method_decorator(login_required, name='dispatch')
    class ProtectedView(TemplateView):
        template_name = 'secret.html'

    为了偷懒,我们可以这么做:

    decorators = [never_cache, login_required]
    
    @method_decorator(decorators, name='dispatch')
    class ProtectedView(TemplateView):
        template_name = 'secret.html'

    唯一需要注意地是装饰器是有先后顺序的。上面的例子中,never_cache就要先于login_required被调用。

    最后,使用method_decorator有时会导致TypeError异常,因为参数传递的原因。

    原文:https://www.liujiangblog.com/course/django/279

  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/gcgc/p/14201619.html
Copyright © 2020-2023  润新知