首页 文章

如何应用装饰器在基于类的视图Django中执行调度方法

提问于
浏览
3

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

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

问题是:

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

1 回答

  • 3

    您可以使用装饰器 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'
    

相关问题