简单Redis速率限制
项目描述
rrl - Redis速率限制
非常简单且可重用的基于Redis的速率限制代码。为OpenStates.org设计。
配置
rrl
,顾名思义,需要一个Redis服务器。
rrl
完全由环境变量进行配置
RRL_REDIS_HOST - Redis实例的主机名(默认:localhost) RRL_REDIS_PORT - Redis实例的端口号(默认:6379) RRL_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)
这些层不使用per_hour功能,但将用户限制为每分钟1个或5个请求。同时,每天也有500或4000个请求的每日限制。
然后您需要一个rrl.RateLimiter
实例,该实例将与这些层一起实例化
limiter = RateLimiter(tiers=[bronze, silver])
然后要应用限制,您将调用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
时,您可以设置一些关键字参数
prefix
传递一个前缀,例如
limiter = RateLimiter(tiers, prefix="v1")
将所有调用限制器的调用范围限定在给定的前缀内,这可以在您想使用多个限制器但想确保它们之间不相互干扰时很有用。
use_redis_time
默认为True
,但如果您将其设置为False
,则应用程序的系统时间将代替Redis的时间。
这里的权衡是每次调用check_limit
时对Redis的调用次数减少一次,但如果您的机器出现任何时钟漂移,可能会出现意外的结果。
track_daily_usage
默认为True
,但如果设置为False
,则rrl
将不会存储使get_usage_since
工作所需的信息。这会导致轻微的负载减少,但使用信息将不会存储在Redis中,并且无法检索。
rrl-0.3.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cfbeb818198bb53c5a3c1cb8df44e2be6049d8484a589d848f678613bc0ecaa3 |
|
MD5 | 6d8e5dbe15abb7fddf7a03cfa5672415 |
|
BLAKE2b-256 | ee232cee4c679108670430a3e56f5d9fe1b63caa57707120d178325dd23ec8b8 |
rrl-0.3.1-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4ac0f1373600ba2d1c4bce05938cd97122e21d8dad81a72ed2108f8f52abc97d |
|
MD5 | 265a140918bebd78c3ce107c20263ee9 |
|
BLAKE2b-256 | d16a3c190e9f9afefa4151322457150b0eae0b3a5d4ce8b95db6f6ae9d9ab0cd |