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

  • 相关阅读:
    C++11中静态局部变量初始化的线程安全性
    213. 打家劫舍 II
    cas解决aba相关问题
    socket[可读可写异常]3种条件的发生
    linux信号处理 (信号产生 信号阻塞 信号集)
    vim set paste解决粘贴乱序乱码问题
    174. 地下城游戏
    208. 实现 Trie (前缀树) 和 面试题 17.13. 恢复空格
    Centos安装和卸载docker
    Go语言轻量级框架-Gin与入门小案例MySQL增删查改
  • 原文地址:https://www.cnblogs.com/sxchen/p/11722286.html
Copyright © 2011-2022 走看看