DRF权限组件校验方式重写

DRF权限类校验方式重写

drf默认的权限校验流程是and的关系,只要有一个校验不通过,就都不通过
我们可以重写方法,修改为or的关系,只要有一个权限类校验通过,就通过
原来的代码:

    def check_permissions(self, request):
        """
        Check if the request should be permitted.
        Raises an appropriate exception if the request is not permitted.
        """
        for permission in self.get_permissions():
            if not permission.has_permission(request, self):
                self.permission_denied(
                    request,
                    message=getattr(permission, 'message', None),
                    code=getattr(permission, 'code', None)
                )

原来循环权限类列表的时候,if判断加了not,表示只要有一个权限类的has_permission校验没通过,就直接返回没权限

重写后的代码:

class NbView(APIView):
    def check_permissions(self, request):
        """
        Check if the request should be permitted.
        Raises an appropriate exception if the request is not permitted.
        """
        no_permission_objects = []
        for permission in self.get_permissions():
            if permission.has_permission(request, self):
                return
            else:
                no_permission_objects.append(permission)
        else:
            self.permission_denied(
                request,
                message=getattr(no_permission_objects[0], 'message', None),
                code=getattr(no_permission_objects[0], 'code', None)
            )

现在循环权限类列表,判断权限类的has_permission方法如果校验通过,直接return,否则将未校验通过的权限类加入到一个列表中,如果for循环完了还没有return,那就走else,返回校验未通过,从未校验通过的列表中取出第一个返回提示

视图类继承此类

class UserView(NbView):
    permission_classes = [ManagerPermission, BossPermission, UserPermission]
    throttle_classes = [UserThrottle ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值