首页 > 编程语言 >drf : 频率源码分析

drf : 频率源码分析

时间:2024-03-25 13:45:34浏览次数:17  
标签:get ip self request 源码 频率 view drf

频率组件

一、自定义频率组件

自定义的逻辑

#(1)取出访问者ip
# (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
# (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
# (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
# (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败

源码实现:

class MyThrottles():
    VISIT_RECORD = {}
    def __init__(self):
        self.history=None
    def allow_request(self,request, view):
        #(1)取出访问者ip
        # print(request.META)
        ip=request.META.get('REMOTE_ADDR')
        import time
        ctime=time.time()
        # (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问
        if ip not in self.VISIT_RECORD:
            self.VISIT_RECORD[ip]=[ctime,]
            return True
        self.history=self.VISIT_RECORD.get(ip)
        # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
        while self.history and ctime-self.history[-1]>60:
            self.history.pop()
        # (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
        # (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败
        if len(self.history)<3:
            self.history.insert(0,ctime)
            return True
        else:
            return False
    def wait(self):
        import time
        ctime=time.time()
        return 60-(ctime-self.history[-1])

二、内置频率组件

第一步 需要写一个频率类 继承SimpleRateThrottle

  1.1 重写get_cache_key 返回self.get_ident(request)
  1.2 重点 一定要配置一个scop=一个字符串

class Throttle(SimpleRateThrottle):
    scope = 'zk'

    def get_cache_key(self, request, view):
        # 返回什么值就以什么做过滤,返回用户的ID 就用用户id过滤
        return self.get_ident(request)  # 内部其实返回的还是一个ip地址

第二步 在settings中配置

REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_RATES':{
               'zk':'3/m' 主要是前面是m就行 后面随便写什么都可以
       }

局部使用:

class Books(APIView):
    throttle_classes = [Throttle, ]  # 局部
    # throttle_classes = []

    def get(self, request):
        return Response('qqqqq')

全局使用:

REST_FRAMEWORK = {
    # 加一下这段话就行 这里注意的小bug就是 频率类不能再vies里面写 不然会报差错
    'DEFAULT_THROTTLE_CLASSES': ['app01.utils.VisitThrottle.Throttle', ],
    'DEFAULT_THROTTLE_RATES': {
        'zk': '3/minute',
    }
}

局部禁用:

class Books(APIView):
    throttle_classes = [] # 局部禁用

    def get(self, request):
        return Response('qqqqq')

三、源码分析

1.首先进来先走as.view() 这里的as.view() 就是APIView 所以进入到APIView

2.因为APIView是的as.view() 是继承了父类的as.view()方法也就是View()类 在view()类中的as.view()是返回了dispatch()

方法所以我们进入dispatch()方法

3.进入initial()方法,找到最后一个就是我圈中的那个方法,就是频率组件

4.进入频率组件方法

5.进入get_throttles()

6.由于我分析的是系统内置的频率组件,然后系统内置的也是会调用到allow_request()方法,不管你是内置的频率组件还是

自定义的频率组件,都会重写allow_request(),所以程序走到这一步,由于是分析系统内置的频率组件,然后自己本身没有allow_request()

这个方法,所以会去他继承的父类去找这个方法。

7.进入SimpleRateThrottle()这个方法,点击图片下方的小圆圈,定位到当前代码,然后进入

allow_request()方法。

8.调用SimpleRateThrottle的时候就会进去加载他的__init__方法

9.进入parse_rate()方法拿到他的返回值 分别是3和60

10进去到自己本身继承的类的allow_request()方法

11.进入到rate的方法查看他的源码



12 结束

标签:get,ip,self,request,源码,频率,view,drf
From: https://www.cnblogs.com/HeroZhang/p/18094203

相关文章

  • drf : 过滤 排序 分页
    过滤和排序并不是所有的接口都需要写,查询所有才需要过滤(根据条件过滤),排序(按某个规则排序,也可倒序)。导入模块:"""OrderingFilter:排序SearchFilter:过滤"""fromrest_framework.filtersimportOrderingFilter,SearchFilter过滤,内置的过滤,必须继承GenericAPIView,才......
  • drf : 认证 频率 权限
    编写登录功能引出认证,权限,频率:前端通过接口测试工具Postman将用户名和密码通过HTTP请求发送至Django框架models.pyfromdjango.dbimportmodels#Createyourmodelshere.classBooks(models.Model):name=models.CharField(max_length=32)price=models.Int......
  • 会议室预约小程序源码系统 带完整的安装代码包以及搭建教程
    随着企业会议需求的日益增长,会议室预约管理成为了一项不可或缺的工作。为了提高预约效率,减少资源冲突,会议室预约小程序应运而生。小编给大家介绍一款功能强大、易于安装的会议室预约小程序源码系统,带有完整的安装代码包及搭建教程。以下是部分代码示例:系统特色功能一览: ......
  • 盲盒交友小程序源码系统 带完整的代码包以及安装部署教程
    盲盒交友小程序源码系统的开发背景,源于社交媒体的蓬勃发展和年轻用户对于新颖、有趣社交方式的追求。盲盒交友作为一种新型的社交模式,以其神秘感和刺激性,迅速在年轻人中走红。而小程序作为一种轻量级、易上手的应用形式,更是为盲盒交友提供了便捷的传播渠道。因此,盲盒交友小程序......
  • 高性能、可扩展、支持二次开发的企业电子招标采购系统源码
     在数字化时代,企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台,涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等多个方面。该系统以项目......
  • drf : 自动生成路由,视图层自定义方法,路由映射方法,action参数。
    扩展一个知识点:在Django中,代码只要顶格编写,程序一运行,代码将直接执行。drf路由Routers自动生成路由需要继承ViewSetMixin子类,重写了as_view()方法。导入模块:fromrest_frameworkimportrouters创建router对象,并注册视图集合,例如:router=SimpleRouter()router.registe......
  • drf : 通用视图类和(GenericAPIView)5个视图扩展类,九个视图子类,视图集。
    视图RESTframework提供了众多的通用视图基类与扩展类,以简化视图的编写。APIViewrest_framework.views.APIViewAPIView是RESTframework提供的所有视图的基类,继承自Django的View父类。GenericAPIView使用[通用视图类]继承自APIVIew,主要增加了操作序列化器和数据库查询的方......
  • 【MATLAB源码-第13期】基于matlab的4ASK的误码率BER和误符号率SER理论和实际对比仿真
    操作环境:MATLAB2022a1、算法描述"4ASK"是一种数字调制技术,代表4级振幅移移键控(4-LevelAmplitudeShiftKeying)调制。它是一种数字通信中常用的调制方式之一,用于将数字信号转换为模拟信号以便传输,或者将模拟信号转换为数字信号以便处理。在4ASK调制中,每个数字比特被映射......
  • 【MATLAB源码-第12期】基于matlab的4FSK(4CPFSK)的误码率BER理论值与实际值仿真。
    操作环境:MATLAB2022a1、算法描述4FSK在频移键控(FSK)编码的基础上有所扩展。FSK是一种调制技术,它通过在不同频率上切换来表示不同的数字或符号。而4FSK则是FSK的一种变种,表示使用了4个不同的频率来传输信息。在4FSK中,每个数字或符号被映射到一组连续的四个频率中的一个。这......
  • 深入了解鸿鹄工程项目管理系统源码:功能清单与项目模块的深度解析
    工程项目管理软件是现代项目管理中不可或缺的工具,它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件,该软件采用先进的Vue、Uniapp、Layui等技术框架,涵盖了项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营等全过程。通过该......