2016-04-15 68 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