在Django中的url.py中使用多个修饰符

在Django中的url.py中使用多个修饰符,django,django-class-based-views,Django,Django Class Based Views,我有一个管理员mixin,用于防止缓存,并通过覆盖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 cl

我有一个管理员mixin,用于防止缓存,并通过覆盖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功能包装到一个decorator中,并在URL.py中调用该decorator,如下所示:

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'),
但是如果我想添加第三个或第四个装饰器,我会更新url.py中的很多行,并重复很多代码


有没有关于如何创建这个decorator包装器的想法?

在URLconfs中使用decorator完全违背了CBV的精神。相反,使用mixin将功能直接添加到视图类的
dispatch
方法中。

如何在不调用客户端的情况下编写这些视图的测试?您所说的“调用客户端”是什么意思?打开浏览器会话?如果需要测试视图输出,没有其他方法;但是我想你实际上想要测试单个方法,比如
get\u context\u data
或者
get\u object
,这很容易通过单元测试来完成。有没有比这更好的方法?你让它听起来很琐碎。在什么意义上更好?您可以看到,与基于函数的视图不同,基于函数的视图每个都是一个函数,CBV将其逻辑封装到多个方法中。因此,与只测试整个视图不同,您确实需要测试单个方法,例如
get\u context\u data
,但前提是您已经在代码中重写了它们;否则,Django的测试已经涵盖了它。实际上,您给出的链接已经包含了CBV测试的一个很好的概述——向下滚动到副标题“基于类的视图测试”。Berislav Lopac在这一点上是正确的。使用tech.novapost.fr/django-unit-test-your-views-en.html中定义的方法,您可以测试CBV的方法,特别是针对我的情况,获取成功url。