我是一个 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 执行上述操作绝对不是正确的方法,我正在考虑在全局范围内这样做,我想我有两种选择来实现/覆盖上面的调度方法:
- 创建我的
BaseView
类,它继承自django.views.generic.base.View
,并让我的所有 View 都继承自这个自定义的BaseView。 - 在我的项目级别覆盖
django.views.generic.base.View
的dispatch
方法
根据我的要求(大多数页面的 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/