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

时间:2015-01-26 18:49:29

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

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

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

问题是:

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

1 个答案:

答案 0 :(得分:4)

您可以使用docs中显示的装饰器method_decorator

来自文档:

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'