2

我在我的應用程序很少有用戶說A,B和C.一旦任何類型的用戶進行身份驗證,我不希望這個用戶訪問我的所有API的在Django的REST框架類爲本次定製的裝飾

所以基於函數的觀點我實現了一個裝飾:

from functools import wraps 

from rest_framework import status 
from rest_framework.response import Response 


def permit(user_type): 
    class Permission(object): 

     def __init__(self, view_func): 
      self.view_func = view_func 
      wraps(view_func)(self) 

     def __call__(self, request, *args, **kwargs): 

      if request.user.user_type in user_type: 
       return self.view_func(request, *args, **kwargs) 
      else: 
       return Response(status=status.HTTP_403_FORBIDDEN) 

    return Permission 

所以假設我要被accesed到一類用戶的我的API的一個我做的:

@permit(["A"]) 
def myview(request): 
    # return some reponse 

這工作得很好,但我有troubl e將其轉換爲基於類的視圖。

我試圖來裝飾調度方法:

@method_decorator(permit_only(["A",])) 
def dispatch(self, request, *args, **kwargs): 
    return super(UserList, self).dispatch(*args, **kwargs) 

但我得到一個錯誤:

AssertionError(u'.accepted_renderer not set on Response',) 

回答

0

一個我來到了這個解決辦法的是繼承IsAuthenticated類像這樣和通它在CBV中的permission_classes或作爲FBV的裝飾者

class PermA(IsAuthenticated): 

    def has_permission(self, request, view): 
     resp = super(PermA, self).has_permission(request, view) 
     return getattr(request.user, "user_type", None) == "A" and resp