阅读'ProDjango'一书,我发现了有关将自定义装饰器应用于基于类的视图中的方法的有趣时刻 .
作者说我们可以手动为每个类的方法指定装饰器,即 get , post 等等,或者我们可以将装饰器添加到 dispatch() 方法中,如果我们这样做,那么装饰器将应用于每个类的方法( get , post 等)
get
post
dispatch()
问题是:
实际上我怎么能将装饰器应用于基于类的视图的dispatch()方法?
您可以使用装饰器 method_decorator ,如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() .
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'
1 回答
您可以使用装饰器
method_decorator
,如docs中所示 .来自文档:
或者您可以在urls.py中执行此操作:
更新:
从Django 1.9开始,您现在可以在类级别使用方法装饰器 . 您需要传递要装饰的方法的名称 . 因此,不需要仅仅为了应用装饰器而覆盖调度 .
例:
此外,您可以定义装饰器的列表或元组,并使用它而不是多次调用
method_decorator()
.示例(以下两个类相同):