首页 > 编程语言 >drf——源码分析

drf——源码分析

时间:2022-10-09 17:01:31浏览次数:45  
标签:分析 permission self request 认证 源码 user drf

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(到了频率的限制)

标签:分析,permission,self,request,认证,源码,user,drf
From: https://www.cnblogs.com/nirvana001/p/16772766.html

相关文章

  • HashMap 源码,看我这篇就够了
    HashMap源码,看我这篇就够了HashMap源码深度剖析*HashMap底层数据结构(为什么引入红黑树、存储数据的过程、哈希碰撞相关问题)*HashMap成员变量(初始化容量是多少......
  • 基于html的购物网站【华为手机购物网站制作】学生网页设计作业源码
    ......
  • Antlr词法分析之技巧——修改某个token
    在上一次的博客Antlr词法分析之技巧——保留空白符中,我们演示了如何通过词法分析、语法分析解析出SQL中的所有表名,然后给没有带库名前缀的表名添加库名前缀。这一次我们......
  • 【物理应用】基于matlab模拟井筒多相流【含Matlab源码 2152期】
    一、获取代码方式二、空气质量分指数(IAQI)城市空气质量指数(AQI)、点位空气质量指数(AQI)每日(24h)、每时的计算结果是由测得的几项污染物的日平均值、小时平均值空气......
  • 单词分析
    1题目描述小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再......
  • 计算机算法设计与分析 实验题 及代码
    很舒服的题目,不难。科班的知识就是舒服。实验2:递归与分治实验目的熟悉递归算法的基本思想和基本步骤,熟练掌握递归公式的推导和定义方法,用递归算法解决实际问题。实验要......
  • 实验2:Open vSwitch虚拟交换机实践、实验3:OpenFlow协议分析实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Pytho......
  • ArrayList源码学习
    arraylist1、总体关系图  1.1:Serializable接口这是一个空接口,只有实现了这个接口的对象才可以进行序列化。然后这个序列化id是为了保证反序列化成功也就是在运......
  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践一、实验要求(一)基本要求1.搭建下图所示拓扑,完成相关IP配置,并实现主机与主机之间的IP通信。用抓包软件获取控制器与交换机之间的通信数据......
  • 分享一个查看分析Oracle表空间使用情况的脚本
    个人一直使用下面这个脚本查看、分析Oracle数据库表空间的使用情况,这个脚本经过我不断的调整、完善,已经接近完美了。已经很长时间没有改动过了,个人累积的脚本名为get_table......