我在阅读一本关于'ProDjango'的书时,发现了一个有趣的点,即如何将自定义decorator应用于基于类的视图中的方法。
作者说我们可以手动为类中的每个方法(例如get
、post
等)分配decorator,或者我们可以将decorator添加到dispatch()
方法中。如果这样做,decorator将被应用于类中的每个方法(get
、post
等)。
问题是:
如何实际将decorator应用于Class-based视图的dispatch()
方法?
我在阅读一本关于'ProDjango'的书时,发现了一个有趣的点,即如何将自定义decorator应用于基于类的视图中的方法。
作者说我们可以手动为类中的每个方法(例如get
、post
等)分配decorator,或者我们可以将decorator添加到dispatch()
方法中。如果这样做,decorator将被应用于类中的每个方法(get
、post
等)。
问题是:
如何实际将decorator应用于Class-based视图的dispatch()
方法?
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开始,您现在可以在类级别使用方法装饰器。您需要传递要装饰的方法的名称。因此,没有必要重写dispatch来应用装饰器。
例子:
@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'
@method_decorator(login_required)
会将我的装饰器添加到 dispatch 方法中,同时保留其默认功能吗? - micgeronimo