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