python - 在全局(项目范围)自定义 Django 类基 View

标签 python django single-sign-on

我是一个 Django 网站的开发人员,该网站将为大多数网页执行 SSO,并且我广泛使用基于类的 View ,official documentation说我们可以用这种方式装饰基于类的 View :

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,我相信对我的大多数 View 执行上述操作绝对不是正确的方法,我正在考虑在全局范围内这样做,我想我有两种选择来实现/覆盖上面的调度方法:

  1. 创建我的BaseView类,它继承自django.views.generic.base.View,并让我的所有 View 都继承自这个自定义的BaseView。
  2. 在我的项目级别覆盖 django.views.generic.base.Viewdispatch 方法

根据我的要求(大多数页面的 SSO),最佳实践是什么?任何建议或建议都将受到高度赞赏!

最佳答案

正如你所说,使用继承似乎是可行的方法,你可以将你的逻辑实现为混合:

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)

然后在其他项目 View 中,您可以执行以下操作:

class BaseView(View):
    # your logic here

class ProtectedBaseView(SSOMixin, BaseView)
    # your logic here

使用 mixin 可能比将此逻辑放入项目 BaseView 中更方便,特别是如果您有一些不需要 SSO 的 View ,或者您想在 View 中使用此逻辑不继承自您的 BaseView

关于python - 在全局(项目范围)自定义 Django 类基 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25839946/

相关文章:

python - 谷歌地图和谷歌应用引擎

django - 如何在 django 中为 HttpRequest.GET 设置默认值?

azure - 504 网关超时错误 Keycloak 与 Microsoft SSO

jsp - 我在 tomcat 中的所有 struts2 应用程序的单点登录

python - 为什么 pip 重新安装 install_requires 中列出的标准包

python - 无法通过子处理捕获 os 错误

python QLineEdit 文本颜色

python - 传递一个变量来显示一个django模型方法

django - 如何修复 Django 的 get_or_create() 并发导致数据重复

oauth - 在移动应用程序中使用 OAuth 2.0 授权代码流时,浏览器应该向移动应用程序返回授权代码或访问 token 吗?