權限流程
權限流程與認證流程非常相似,只是后續操作稍有不同
當用戶訪問是 首先執行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"], }
待續