zoukankan      html  css  js  c++  java
  • 三大认证源码分析

    认证组件

    通过dispath方法,进入三大认证:

    首先看一下请求模块,进入request

    进入get_authenticators 方法

    可以知道,请求模块二次封装request对象,包含解析模块,还将认证类们的对象存储在请求对象中。

    进入三大认证

    遍历一个个认证器,完成一个个认证类,每一个配置的认证类都要调用authenticate方法完成认证。返回值是user和auth组成的元组。

    权限组件

    频率组件

    通过dispatch方法 进入频率组件

    然后看SimpleRateThrottle类,有allow_request和 wait 方法。SimpleRateThrottle继承BaseThrottle,BaseThrottle也有allow_request和 wait两个方法,但它没写,需要自己写。

    所以我们继承SimpleRateThrottle类,它帮我们写了allow_request和 wait两个方法

    # 可以直接在自定义频率类中配置rate,这就是要动源码了
    rate = '3/min'
    
    # 但是推荐在自定义频率类中配置scope属性,然后再在settings文件中设置scope
    class MobileReateThrottle(SimpleRateThrottle):
        scope = 'mobile'
        def get_cache_key(self, request, view):
            if not request.user.is_authenticated or not request.user.mobile:
                return None   # 匿名用户   没有电话号的用户都不限制
            
            return self.cache_format % {
                'scope': self.scope,
                'ident': request.user.mobile
            }
        
    
    # settings文件
    REST_FRAMEWORK = {
        # 频率组件,频率类一般做局部配置,但是频率调节在settings中配置
        'DEFAULT_THROTTLE_RATES': {
            'user': '5/min',   # 登录用户限制
            'anon': '3/min',   # 匿名用户限制,
            'mobile': '1/min'
        },
    
    }
    

    来到上面的__init__方法中

    回到allow_request

    cache.set(key, value, exp) 设置过期缓存,exp设为0,代表缓存不过期

    请求一次,将时间保存一次,保存在self.history中

    根据请求时间形成的列表长度判断是否限次

    进入wait方法

  • 相关阅读:
    hdu 6068 Classic Quotation
    hdu 6071 Lazy Running
    数论基础--质因数分解
    喵哈哈村的魔法考试 Round #10 (Div.2) E
    喵哈哈村的魔法考试 Round #10 (Div.2) D
    喵哈哈村的魔法考试 Round #10 (Div.2) C
    喵哈哈村的魔法考试 Round #10 (Div.2) B
    喵哈哈村的魔法考试 Round #10 (Div.2) A
    L1-025. 正整数A+B
    L2-015. 互评成绩
  • 原文地址:https://www.cnblogs.com/setcreed/p/12153408.html
Copyright © 2011-2022 走看看