DRF权限组件源码分析
权限组件相关配置同认证组件
0 认证组件的三种返回值
- 有权限,返回True,程序正常进行
- 无权限,返回False,程序抛出异常
1 单视图应用
2 多视图应用
3 单视图多视图结合
在drf中,默认优先去全局中读取,再去视图类中读取。
我们可以将个别视图类的authentication_classes
列表置为空
4 多个认证组件关系
在drf开发中,如果有些接口必须同时满足:A条件、B条件、C条件。 有些接口只需要满足:A条件或B条件或C条件,此时就可以利用权限组件来编写这些条件。
python">from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.response import Responseclass DemoView(APIView):permission_classes = [权限类A, 权限类B, 权限类C]def get(self, request: Request):return Response({"status": True, "data": "OK"})
-
且关系,默认支持:A条件 且 B条件 且 C条件,同时满足。
python">class PermissionA(BasePermission):message = {"code": 1003, 'data': "无权访问"} # 自定义错误信息def has_permission(self, request, view):if request.user.role == 2:return Truereturn False
-
或关系,自定义(方便扩展)(不要改源码,在视图函数内定义
check_permissions
方法)python">class APIView(View):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 permission.has_permission(request, self): # 只要有一个是Ture,就有权限returnreturn self.permission_denied(request,message=getattr(permission, 'message', None),code=getattr(permission, 'code', None))