權限: 問題:不用視圖不用權限可以訪問 基本使用 寫上一個權限類 創建utils 中 permission.py文件 class SvipPermisson(object): message = "必須是SVIP用戶,否則無權訪問" #頁面無權時報錯提示 def has_permission(self, request, view): if request.user.user_type != 3: return False return True class OrderView(APIView): """ 訂單相關業務 (只有SVIP用戶有權限) """ #authentication_classes = [FirstAuthtication, Authtication] permission_classes = [MyPermission, ] def get(self, request, *args, **kwargs): self.dispatch ret = {'code':1000, "msg":None, 'data':None } try: ret['data'] = ORDER_DICT except Exception as e: pass return JsonResponse(ret) self.check_permissons(request) #返回權限的對象列表 或者說 [權限類的對象] for permission in self.get_permissions(): if not permission.has_permisstion(requst, self): #如果ha_permisstion返回True 就不執行該函數 就可以通過權限認證 self.permission_denied( request, message = getattr(permission, 'message', None) ) 可以在全局配置 也可以自己定制 REST_FRAMEWORK = { #全局使用的認證類 #認證 "DEFAULT_AUTHENTICATION_CLASSES":['api.utils.auth.FirstAuthtication',] "UNAUTHENTICATED_USER":None #匿名用戶 request.user = None #權限 "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SvipPermisson'] } 如果要自定義 可以在class UserInfoVIew(APIView): """ 訂單相關業務(普通用戶) """ permission_classes = [PublicPermission,] #寫完這樣 就不會讀全局的權限訪問 也可以為空 如permission_classes= [] 源碼流程: dispatch initial permission 內置的權限 from rest_framework.permissions import BasePermission class SVIPPermission(BasePermission): #按規范 需要繼承BasePermission message = "必須是SVIP才能訪問" def has_permission(self, request, view): if request.user.user_type != 3: return False return True 梳理: 1.使用 -類: 繼承 BasePermission 必須實現 has_permission方法 from rest_framework.permissions import BasePermission class SVIPPermission(BasePermission): #按規范 需要繼承BasePermission message = "必須是SVIP才能訪問" def has_permission(self, request, view): if request.user.user_type != 3: return False return True -返回值: True #有權訪問 False #無權訪問 拋出異常 一般不做異常拋出異常 message = "SVIP" 局部: permission_classes = [Mypermission] 全局: REST_FRAMEWORK = { "EDEFAULT_PERMISSION_CLASSES" :['api.utils.perimission.MyPermission'] } 2.源碼流程
