如何在基于 class 的 Django 视图中应用装饰器 do dispatch 方法

How to apply decorator do dispatch method in class-based views Django

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

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

的每个方法

问题是:

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

您可以使用 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 开始,您现在可以在 class 级别使用方法装饰器。您将需要传递要装饰的方法的名称。所以没有必要为了应用装饰器而重写 dispatch。

示例:

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

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

例子(下面两个class是一样的):

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'