rest_framework 權限功能


權限:
    問題:不用視圖不用權限可以訪問

    基本使用

    寫上一個權限類  創建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.源碼流程

 


免責聲明!

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



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