2016-04-15 62 views
2

我想实现staff_member_required混入:Django中混入了基于类的通用视图

这里有两种方法,我就怎么做,以便发现:

第一:

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的新手。请帮忙。

回答

3

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方法中的​​代码,因为任何未通过的用户都将被as_view方法过滤掉。

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

相关问题