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():
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加括号调用,
所以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()
return False
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现