简单redis速率限制
rrl的Python项目详细描述
rrl-Redis速率限制
非常简单的可重用redis支持的速率限制代码。设计用于OpenStates.org网站. 在
配置
顾名思义,rrl
需要一个Redis服务器。在
rrl
完全由环境变量配置:
RRL_REDIS_HOST-REDIS实例的主机名(默认:localhost) RRL\$REDIS_PORT-REDIS实例的端口(默认:6379) RRL\u REDIS_DB-用于RRL的数据库ID(默认:0)
使用
可以按每分钟、每小时和/或每天来限制使用量。在
rrl
有一个Tier
的概念,它将一个名称与一组限制相关联,例如:
# create two tiers
bronze = Tier(name="bronze", per_minute=1, per_hour=0, per_day=500)
silver = Tier(name="silver", per_minute=5, per_hour=0, per_day=4000)
这些层不使用每小时功能,但将用户限制为每分钟1或5个请求。每天也有500到4000个请求的限制。在
然后您需要一个rrl.RateLimiter
的实例,它将用以下层实例化:
然后要应用限制,您将调用check_limit
函数,它有三个参数:
key
-每个用户的唯一密钥,通常是用户的API密钥或用户名。(注意:rrl
不知道密钥是否有效,该验证应该在应用程序中,并且通常在调用check_limit
之前进行。)tier_name
-实例化RateLimiter
类时指定的一个层的名称。(注意:rrl
没有关于哪些用户在哪个层的概念,该逻辑应该由密钥验证代码处理。)
示例调用:
limiter.check_limit(key="1234", tier_name="bronze")
如果该呼叫被视为允许,则该呼叫将毫无错误地返回。在
如果超过任何速率限制,它将引发一个RateLimitExceeded
异常,描述超出了哪个限制。
如果超过多个限制,它将返回违反的最短限制。在
高级用法
获取使用信息
您的RateLimiter
实例还有一个名为get_usage_since
的方法,它有四个参数:
key
-您请求的是哪个密钥的使用信息。在start
-希望使用的日期,作为datetime.date
对象。在end
-如果您只希望在某个窗口内使用,则选择结束日期,否则将使用当前日期。在
这将返回具有以下属性的DailyUsage
数据类的列表:
date
-datetime.date
calls
-该日期的呼叫数。在
此方法可用于向用户显示其数据的概述。在
高级配置
实例化RateLimiter
时,可以设置几个仅限关键字的参数:
前缀
传递前缀如下:
limiter = RateLimiter(tiers, prefix="v1")
将所有对LIMITOR的调用范围限定为给定的前缀,如果您希望使用多个限制器,但又希望确保它们不会相互干扰,则这将非常有用。在
use\u redis\u时间
默认情况下,True
,但如果设置为False
,则将使用应用程序的系统时间。在
这里的折衷是每次调用check_limit
时少调用一次Redis,但是如果您的机器遇到任何时钟偏移,可能会出现意外的结果。在
track_每日使用量
默认情况下,True
,但如果设置为False
,rrl
将不会存储使get_usage_since
工作所需的信息。这会稍微减少开销,但使用信息不会存储在Redis中,并且无法检索。在
- 项目
标签: