我是开发人员的Django网站,它将为大多数网页进行SSO,我正在广泛使用基于类的视图,official documentation说我们可以用这种方式装饰基于类的视图:
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)
我已经实施了一个自定义的sso_login_required
装饰器,但由于我的大多数网页都会进行SSO,因此我认为,对于我的大多数观点,上面做的是绝对不是正确的方式,我我想在全球范围内这样做,我想我有两个选项来实现/覆盖上面的调度方法:
BaseView
的{{1}}类,并让我的所有视图都继承自此自定义的BaseView。django.views.generic.base.View
的{{1}}方法根据我的要求(大多数页面的SSO),这里的最佳做法是什么?任何建议或建议都非常感谢!
答案 0 :(得分:1)
正如你所说,使用继承似乎是可行的方法,你可以将你的逻辑实现为mixin:
from yourproject.decorators import sso_login_required
from django.utils.decorators import method_decorator
class SSOMixin(object):
@method_decorator(sso_login_required)
def dispatch(self, *args, **kwargs):
return super(SSOMixin, self).dispatch(*args, **kwargs)
然后在您的其他项目视图中,您可以执行以下操作:
class BaseView(View):
# your logic here
class ProtectedBaseView(SSOMixin, BaseView)
# your logic here
使用mixin可能比将此逻辑放在项目BaseView
中更方便,特别是如果您有一些不需要SSO的视图,或者如果您想在不具有SSO的视图中使用此逻辑继承自BaseView
。