【问题标题】:How to apply decorator do dispatch method in class-based views Django如何在基于类的视图 Django 中应用装饰器执行调度方法
【发布时间】:2015-03-25 06:05:06
【问题描述】:

阅读“ProDjango”一书,我发现了将自定义装饰器应用于基于类的视图中的方法的有趣时刻。

作者说我们可以手动将装饰器分配给类的每个方法,即getpost 等等,或者我们可以将我们的装饰器添加到dispatch() 方法中,如果我们这样做,那么装饰器将应用于类的每个方法(getpost 等)

问题是:

实际上我如何将装饰器应用于基于类的视图的 dispatch() 方法?

【问题讨论】:

    标签: python django django-views django-class-based-views


    【解决方案1】:

    您可以使用装饰器method_decorator,如docs 中所示。

    来自文档:

    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(ProtectedView, self).dispatch(*args, **kwargs)
    

    或者你可以在你的 urls.py 中做:

    from django.conf.urls import patterns
    from django.contrib.auth.decorators import login_required
    from myapp.views import MyView
    
    urlpatterns = patterns('',
        (r'^about/', login_required(MyView.as_view())),
    )
    

    更新:

    从 Django 1.9 开始,您现在可以在类级别使用方法装饰器。您将需要传递要装饰的方法的名称。所以没有必要仅仅为了应用装饰器而重写调度。

    例子:

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

    此外,您可以定义一个装饰器列表或元组并使用它来代替多次调用method_decorator()

    示例(以下两个类相同):

    decorators = [never_cache, login_required]
    
    @method_decorator(decorators, 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'
    

    【讨论】:

    • @method_decorator(login_required) 是否只会将我的装饰器添加到调度方法中,保存所有它的默认功能?
    • 是的,除非我误解了默认功能的含义。
    猜你喜欢
    • 2023-02-07
    • 2017-03-08
    • 1970-01-01
    • 2012-06-11
    • 2011-08-29
    • 2017-11-29
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多