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 ]