【问题标题】:Django mixins for class-based-generic views用于基于类的通用视图的 Django mixins
【发布时间】:2016-08-06 22:25:44
【问题描述】:

我正在尝试实现 staff_member_required mixins:

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

第一:

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)

我想知道的是:

  1. 为什么第二种方法是覆盖as_view() 方法并用staff_member_required 包装它?

  2. 这样做是否会获得任何“额外”优势?

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

【问题讨论】:

    标签: django django-views mixins


    【解决方案1】:

    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 功能在视图的 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。这意味着如果您同时使用两者,您实际上不会触发dispatch 方法中的if not request.user.is_staff 代码,因为任何未通过的用户都会在@987654340 中被过滤掉@方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 2012-02-21
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多