如何在基于类的视图Django中应用装饰器到派发方法

5

我在阅读一本关于'ProDjango'的书时,发现了一个有趣的点,即如何将自定义decorator应用于基于类的视图中的方法。

作者说我们可以手动为类中的每个方法(例如getpost等)分配decorator,或者我们可以将decorator添加到dispatch()方法中。如果这样做,decorator将被应用于类中的每个方法(getpost等)。

问题是:

如何实际将decorator应用于Class-based视图的dispatch()方法?

1个回答

6
您可以像文档中所示一样使用装饰器 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
是的,除非我误解了您所说的默认功能。 - schillingt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接