rest_framework 權限流程


權限流程

權限流程與認證流程非常相似,只是后續操作稍有不同

當用戶訪問是 首先執行dispatch函數,當執行當第二部時:

   #2.處理版本信息 處理認證信息 處理權限信息 對用戶的訪問頻率進行限制
            self.initial(request, *args, **kwargs)

進入到initial方法:

 def initial(self, request, *args, **kwargs):
        """
        Runs anything that needs to occur prior to calling the method handler.
        """
        self.format_kwarg = self.get_format_suffix(**kwargs)

        # Perform content negotiation and store the accepted info on the request
        neg = self.perform_content_negotiation(request)
        request.accepted_renderer, request.accepted_media_type = neg

        # Determine the API version, if versioning is in use.
        #2.1處理版本信息
        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme

        # Ensure that the incoming request is permitted
        #2.2處理認證信息
        self.perform_authentication(request)
        #2.3處理權限信息
        self.check_permissions(request)
        #2.4對用戶的訪問頻率進行限制
        self.check_throttles(request
 #處理權限信息
        self.check_permissions(request)

下面 開始 權限的具體分析:

進入到check_permissions函數中

 #檢查權限
    def check_permissions(self, request):
        """
        Check if the request should be permitted.
        Raises an appropriate exception if the request is not permitted.
        """
        #elf.get_permissions()得到的是一個權限對象列表
        for permission in self.get_permissions():
            #在自定義的Permission中has_permission方法是必須要有的
            #判斷當前has_permission返回的是True,False,還是拋出異常
            #如果是True則表示權限通過,False執行下面代碼
            if not permission.has_permission(request, self):
                #為False的話則拋出異常,當然這個異常返回的提示信息是英文的,如果我們想讓他顯示我們自定義的提示信息
                #我們重寫permission_denied方法即可
                self.permission_denied(
                    #從自定義的Permission類中獲取message(權限錯誤提示信息),一般自定義的話都建議寫上,如果沒有則為默認的(英文提示)
                    request, message=getattr(permission, 'message', None)
                )

查看permission_denied方法(如果has_permission返回True則不執行該方法)

 def permission_denied(self, request, message=None):
        """
        If request is not permitted, determine what kind of exception to raise.
        """
        if request.authenticators and not request.successful_authenticator:
            #沒有登錄提示的錯誤信息
            raise exceptions.NotAuthenticated()
        #一般是登陸了但是沒有權限提示
        raise exceptions.PermissionDenied(detail=message)

局部權限

permissions.py

# 局部權限
from rest_framework.permissions import BasePermission
class SVIPPermissions(BasePermission):
    # 提示信息
    message = "滾!您沒有權限"
    def has_permission(self,request,view):

        # 獲取到認證的返回值
        user_obj=request.user.user
        if user_obj.user_type==3:
            return True
        else:
            return False

view.py

class BookViewsSet(viewsets.ModelViewSet): 

   # 權限
    permission_classes=[SVIPPermissions]

    queryset = Book.objects.all()
    serializer_class = BookModelSerializer

全局權限

permissions.py

# 局部權限
from rest_framework.permissions import BasePermission
class SVIPPermissions(BasePermission): # 提示信息 message = "滾!您沒有權限" def has_permission(self,request,view): # 獲取到認證的返回值 user_obj=request.user.user if user_obj.user_type==3: return True else: return False

settings.py

REST_FRAMEWORK={
     "DEFAULT_PERMISSION_CLASSES":["api.servise.permission.SVIPPermissions"],
}

待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM