我正在尝试实现 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; DR :它们几乎相同,区别在于检查 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/