如何在基于 class 的 Django 视图中应用装饰器 do dispatch 方法
How to apply decorator do dispatch method in class-based views Django
阅读 'ProDjango' 一本书,我发现了关于将自定义装饰器应用于基于 class 的视图中的方法的有趣时刻。
作者说我们可以手动为 class 的每个方法分配装饰器,即 get
、post
等等,或者我们可以将我们的装饰器添加到 dispatch()
方法,如果我们这样做,装饰器将应用于 class(get
、post
等)
的每个方法
问题是:
我实际上如何将装饰器应用于基于 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'
阅读 'ProDjango' 一本书,我发现了关于将自定义装饰器应用于基于 class 的视图中的方法的有趣时刻。
作者说我们可以手动为 class 的每个方法分配装饰器,即 get
、post
等等,或者我们可以将我们的装饰器添加到 dispatch()
方法,如果我们这样做,装饰器将应用于 class(get
、post
等)
问题是:
我实际上如何将装饰器应用于基于 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'