django restframework学习笔记:权限组件

作用

在drf开发中,如果有些接口必须同时满足:A条件、B条件、C条件。 有些接口只需要满足:B条件、C条件,此时就可以利用权限组件来编写这些条件。

权限组件 = [权限类, 权限类, 权限类, …] -> 执行所有权限类的has_permission方法,返回True通过、返回False表示不通过

  • 执行所有的权限类
  • 学会源代码,扩展 + 自定义

默认情况下,保证所有的权限类中的has_permission方法都返回True,也就是支持且关系

且关系

默认支持:A条件 且 B条件 且 C条件,同时满足。

1
2
3
4
5
6
7
8
9
10
11
class PermissionA(BasePermission):
message = {"code": 1003, 'data': "无权访问"}

def has_permission(self, request, view):
if request.user.role == 2:
return True
return False

# 暂时先这么写
def has_object_permission(self, request, view, obj):
return True

或关系

自定义(方便扩展)

源码只适合且关系,如果需要支持或关系,需要修改源码中的逻辑。

但是我们发正式环境不可能去修改drf源码,所以这里我们使用面向对象的继承方法,

直接在视图中去定义权限组件的check_permissions方法,这样优先使用视图中的,源码的不会生效

1
2
3
4
5
6
7
8
9
class APIView(View):
def check_permissions(self, request):
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)
)

如果有较多的视图需要使用,可以单独定义一个视图类,添加自定义权限组件

然后视图引用这个view并继承即可(替代APIview)

与中间件的关系

中间件是最先执行的,直行道对象的dspatch方法的时候才开始执行我们的组件