• 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

  • 相关阅读:
    两种方法生成随机字符串
    cmd命令总结
    NOI前乱写
    多校模拟9
    字符串 口胡
    HEOI2020游记
    省选模拟104
    省选模拟103
    省选模拟102
    省选模拟101
  • 原文地址:https://www.cnblogs.com/sxchen/p/11722286.html
Copyright © 2020-2023  润新知