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