drf——源码分析
- 认证源码分析
- 权限源码分析
- 频率类源码分析
三大认证的源码分析
之前读取的APIView的源码的执行流程中包装了新的request,执行了三大认证,执行视图类的方法,处理了全局异常
-
查看源码的入口
APIView的dispatch
-
进入后在APIView的dispatch的496行上下
self.initial(request, *args, **kwargs)中
-
查看APIView的initial
413行上下有三句话,分别是认证、权限、频率
self.perform_authentication(request) self.check_permissions(request) self.check_throttles(request)
这三个分别是三大认证的源码分析的读取入口
认证源码分析
-
读取认证类源码——APIView的perform_authentication(request)
def perform_authentication(self, request): request.user # 新的request
request是新的request
Request类中找user属性(方法),是个方法包装成了数据属性
-
点击request类找到user属性(方法)
def user(self): if not hasattr(self, '_user'): # Request类的对象中反射_user with wrap_attributeerrors(): self._authenticate() # 第一次会走这个代码 return self._user
查找到user属性后先进行判断函数是否包含_user属性,不包含则进行if内操作调用 self._authenticate()
-
点击 Request的self._authenticate()
def _authenticate(self): for authenticator in self.authenticators: # 配置在视图类中所有的认证类的对象 try: #(user_token.user, token) user_auth_tuple = authenticator.authenticate(self) # 调用认证类对象的authenticate except exceptions.APIException: self._not_authenticated() raise if user_auth_tuple is not None: self._authenticator = authenticator # 忽略 self.user, self.auth = user_auth_tuple # 解压赋值 return self._not_authenticated() # 认证类可以配置多个,但是如果有一个返回了两个值,后续的就不执行了
-
总结
认证类,要重写authenticate方法,认证通过返回两个值或None,
认证不通过抛AuthenticationFailed(继承了APIException)异常
权限源码分析
-
读取权限类源码 APIView的check_permissions(request)
def check_permissions(self, request): for permission in self.get_permissions(): # permission是咱们配置在视图类中权限类的对象,对象调用它的绑定方法has_permission # 对象调用自己的绑定方法会把自己传入(权限类的对象,request,视图类的对象) if not permission.has_permission(request, self): self.permission_denied( request, message=getattr(permission, 'message', None), code=getattr(permission, 'code', None) )
-
读取APIVIew的 self.get_permissions()
return [permission() for permission in self.permission_classes] """self.permission_classes 就是咱们在视图类中配的权限类的列表"""
所以这个get_permissions返回的是 在视图类中配的权限类的对象列表[UserTypePermession(),]
-
总结
为什么要写一个类,重写has_permission方法,
has_permission有三个参数,分别是 权限类的对象,request,视图类的对象
为什么一定要return True或False:
返回True是通过权限,Flase是未通过权限
messgage的作用:
调用self.messgage可以更改提示信息
频率类源码
-
读取频率类源码 APIView的check_throttles
def check_throttles(self, request): throttle_durations = [] for throttle in self.get_throttles(): if not throttle.allow_request(request, self): throttle_durations.append(throttle.wait())
-
总结
要写频率类,必须重写allow_request方法
返回True(没有到频率的限制)或False(到了频率的限制)