zoukankan      html  css  js  c++  java
  • drf框架之三大认证之频率类源码分析

    1.首先所有drf框架的源码基本都在APIView的dispatch方法中进入
    
    2.三大认证是在self.initial(request, *args, **kwargs)点进去
    
    3.在self.check_throttles(request) 进行频率认证

    1.入口频率组件的入口


    2.进入该方法,该方法在频率组件类中遍历出频率类

    3.进入throttle组件的allow_request方法中

    4.父类中没有写该方法,需要重写这个方法

    5.进入拥有allow_request方法的子类

    6.寻找rate。从第9步回来rate暂时还不知道是什么

    7.在__init__中初始化定义了rate

    8.该方法中定义了rate
    9.由于没有scope肯定会报错,在后面几个示例的方法中发现我们需要提前定义scope,故我们假定scope=user,从配置中拿出key为user的值,此时我们还不知道值是什么

    10.进入该方法,发现该方法需要重写,故我们以下方的UserRateThrottle类方法为例。从步骤12可知self.key是'throttle_user_1'

    11.self.cache_format是'throttle_%(scope)s_%(ident)s'

    12.我们假定pk为1,故return的是'throttle_%(scope)s_%(ident)s' =》 'throttle_user_1'

    13.从django的缓存中拿出key为'throttle_user_1'的值赋值给self.history,self.now是当前时间

    14.当缓存中拿出self.history,并且当最后一个值小于当前时间减去60(限制的频率时间)。从16可知
    并且当小于时自动将最后一个值移除,如果缓存中的历史大于声明的次数3,就返回False,代表界面访问次数超过限制
    否则就将当前时间插入self.history,再将'throttle_user_1'作为key,self.history作为值,self.duration作为有效时间存入缓存中,返回True,代表还可以继续访问

    15.从该方法得知rate必定是(数字 + / + s,m,h,d开头的一个字符),猜测可知,应该是配置频率,如3/m,一分钟三次

    16.如3/m,那么第一个就是3,第二个就是m对应的60

    17.如果限制的频率是3/m,一分钟三次,
    那么当第一次访问时,正常进入,将访问当前时间,过期时间放入缓存这种,
    第二次来时判断是否频率内的时间,如果超过了就移除该访问记录,再判断访问记录是否超过限制,如果超过就返回False,否则True
    如果在1分钟内超过四次时,返回False

  • 相关阅读:
    使用Java实现对MySql数据库的导入与导出
    【转】揭开J2EE集群的神秘面纱
    Memcached深度分析
    HSQL入门及使用指南
    系统架构基础篇(高性能基础建设说明与选型条件)
    架构之美 摘抄
    JMS规范及相关实现
    spring3中使用@value注解获取属性值
    Thread Dump 分析综述
    什么中间件及中间件服务器?
  • 原文地址:https://www.cnblogs.com/sxchen/p/11722286.html
Copyright © 2011-2022 走看看