在Django中的urls.py中使用多个装饰器

时间:2013-10-11 15:59:26

标签: django django-class-based-views

我有一个管理混合,我用它来阻止缓存并确保用户通过覆盖dispatch()登录。它正在我的基于类的视图中使用。

# mixins.py
from django.contrib.admin.views.decorators import staff_member_required
from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache

class AdminPageMixin(object):
    @method_decorator(never_cache)
    @method_decorator(staff_member_required)
    def dispatch(self, request, *args, **kwargs):
        return super(AdminPageMixin, self).dispatch(request, *args, **kwargs)

# views.py
class SomeAdminView(AdminPageMixin, ListView):

当我尝试对SomeAdminView运行单元测试时,我遇到了问题。是的,我知道我可以使用django的测试客户端登录,但我正试图远离编写功能测试。相反,我想将AdminPageMixin功能包装到单个装饰器中并在urls.py中调用该装饰器,如下所示:

url(r'^myurl/$', decorator_wrapper(SomeAdminView.as_view()), name='some-admin-view'),

或者,我可以这样做:

url(r'^myurl/$', never_cache(staff_member_required(SomeAdminView.as_view())), name='some-admin-view'),

但如果我想添加第三个或第四个装饰器,我会更新urls.py中的很多行并重复大量代码。

有关如何创建此装饰器包装器的任何想法吗?

1 个答案:

答案 0 :(得分:0)

在URLconf中使用装饰器完全违背了CBV的精神。相反,使用mixins将功能直接添加到视图类的dispatch方法。