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

2024-04-20 08:39:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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继承的django.views.generic.base.View类,并让我的所有视图从这个定制的BaseView继承。你知道吗
  2. 在我的项目级别重写django.views.generic.base.Viewdispatch方法

根据我的要求,这里的最佳实践是什么(大多数页面的SSO)?如有任何推荐或建议,我们将不胜感激!你知道吗


Tags: django方法fromimportdecorators视图网站required
1条回答
网友
1楼 · 发布于 2024-04-20 08:39:53

正如您所说,使用继承似乎是一种可行的方法,您可以将您的逻辑实现为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的视图,或者希望在不从BaseView继承的视图中使用此逻辑。你知道吗

相关问题 更多 >