drf三大认证之权限源码解析

1.认证,频率,权限的源码解读入口就是APIView源码的dispatch方法的三大认证,全局异常处理
   self.initial(request, *args, **kwargs)

2.查看APIView的initial里面的三句代码 就是三大认证
        self.perform_authentication(request)   认证
        self.check_permissions(request)        权限
        self.check_throttles(request)          频率

3.先查看权限 在APIView的check_permissions 
   for permission in self.get_permissions():   # 主要查看get_permissions()
          if not permission.has_permission(request, self):
                self.permission_denied(
                    request,
                    message=getattr(permission, 'message', None),
                    code=getattr(permission, 'code', None)
                )

4.查看APIView里的get_permissions 
  return [permission() for permission in self.permission_classes] 
  # 列表推导式  从self.permission_classes中获取到permission然后加括号执行
   '''self.permission_classes就是自己编写的在视图类中写的权限列表,取出里面的permission加括号调用,
      所以get_permissions返回的就是自己写的权限类的对象列表UserTypePermission()
      那么第三条for permission in 【UserTypePermission()】: 就是在循环自己的权限对象列表
   '''

5.为什么要重写has_permission方法
   if not permission.has_permission(request, self):
   这里的permission就是权限对象,而我们重写的has_permission(self, request, view):传了三个参数
   '''这里的三个参数分别是:
     self对象调用类里面的方法,会将自身当作第一个参数传入 (源码里没有写,其实自动传入了)
     request还是那个新的request
     view是视图函数的对象,也就是APIView里的对象  (因为是在APIView中执行的所以源码里的参数是self,)
   '''

   所以重写has_permission方法,如果返回的是Ture,就是有权限,如果返回的是False,那么没有权限
   而源码里的has_permission方法只有在重写返回值是false的时候才会执行里面的message
    class UserTypePermission(BasePermission):
    def has_permission(self, request, view):
        if request.user.user_type == 1:
            return True
        else:
            self.message = '您是%s,您没有权限访问' % request.user.get_user_type_display()
            # 这里的message就是源码里的message
            return False
posted @ 2022-10-09 20:19  Hsummer  阅读(25)  评论(0编辑  收藏  举报