在全局(项目范围)自定义Django类基本视图

时间:2014-09-15 02:12:16

标签: python django single-sign-on

我是开发人员的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,因此我认为,对于我的大多数观点,上面做的是绝对不是正确的方式,我我想在全球范围内这样做,我想我有两个选项来实现/覆盖上面的调度方法:

  1. 创建继承自BaseView的{​​{1}}类,并让我的所有视图都继承自此自定义的BaseView。
  2. 在我的项目级别覆盖django.views.generic.base.View的{​​{1}}方法
  3. 根据我的要求(大多数页面的SSO),这里的最佳做法是什么?任何建议或建议都非常感谢!

1 个答案:

答案 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