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.源码流程

猜你喜欢

转载自www.cnblogs.com/Liang-jc/p/9314059.html