gpt4 book ai didi

用于基于类的通用 View 的 Django mixins

转载 作者:行者123 更新时间:2023-12-01 12:28:52 26 4
gpt4 key购买 nike

我正在尝试实现 staff_member_required 混合:

以下是我找到的两种方法:

第一的:

class StaffRequiredMixin(object):
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
if not request.user.is_staff:
messages.error(
request,
'You do not have the permission required to perform the '
'requested operation.')
return redirect(settings.LOGIN_URL)
return super(StaffRequiredMixin, self).dispatch(request,
*args, **kwargs)

第二:
class StaffRequiredMixin(object):
@classmethod
def as_view(self, *args, **kwargs):
view = super(StaffRequiredMixin, self).as_view(*args, **kwargs)
return staff_member_required(view)

@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
if not request.user.is_staff:
messages.error(
request,
'You do not have the permission required to perform the '
'requested operation.')
return redirect(settings.LOGIN_URL)
return super(StaffRequiredMixin, self).dispatch(request,
*args, **kwargs)

我想知道的是:
  • 为什么第二种方式会覆盖 as_view()方法并用 staff_member_required 包裹它?
  • 这样做我们是否获得任何“额外”优势?

  • 我是这些 mixin 的新手。请帮忙。

    最佳答案

    TL;博士 :它们几乎相同,区别在于检查 is_active以及 is_staff和错误 messages .您可能不需要两者,因为 as_view覆盖否定了对 dispatch 的需要无论如何覆盖。

    这些实际上只是接近同一件事的两种方式。

    这段代码:

    class StaffRequiredMixin(object):
    @classmethod
    def as_view(self, *args, **kwargs):
    view = super(StaffRequiredMixin, self).as_view(*args, **kwargs)
    return staff_member_required(view)

    ...实际上可以单独使用来实现 staff_member_required decorator .在这种情况下, staff_member_required功能在 View 的 as_view() 中被调用函数(即,来自 URLConf 中的 as_view())。

    这段代码:
    class StaffRequiredMixin(object):
    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
    if not request.user.is_staff:
    messages.error(
    request,
    'You do not have the permission required to perform the '
    'requested operation.')
    return redirect(settings.LOGIN_URL)
    return super(StaffRequiredMixin, self).dispatch(request,
    *args, **kwargs)

    ...过滤 dispatch 中的用户方法。您可以在 Django 代码库中看到 as_view actually calls dispatch .这意味着如果你同时使用两者,你​​实际上永远不会触发 if not request.user.is_staff dispatch 中的代码方法,因为任何未通过的用户都会在 as_view 中被过滤掉。方法。

    第二个区别是 staff_member_required与第一个代码的作用略有不同。如果您 check out the code ,您会注意到 staff_member_required还会检查用户的 is_active 是否标志传递(不仅仅是 is_staff 就像你的 dispatch 装饰器)。它也没有通过 messages.error就像在你的代码中一样。

    关于用于基于类的通用 View 的 Django mixins,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36638811/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com