简单redis速率限制

rrl的Python项目详细描述


rrl-Redis速率限制

非常简单的可重用redis支持的速率限制代码。设计用于OpenStates.org网站. 在

Test

配置

顾名思义,rrl需要一个Redis服务器。在

rrl完全由环境变量配置:

RRL_REDIS_HOST-REDIS实例的主机名(默认:localhostRRL\$REDIS_PORT-REDIS实例的端口(默认:6379RRL\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的实例,它将用以下层实例化:

^{pr2}$

然后要应用限制,您将调用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,但如果设置为Falserrl将不会存储使get_usage_since工作所需的信息。这会稍微减少开销,但使用信息不会存储在Redis中,并且无法检索。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Intellij和Eclipse无法找到库工件   java Mapbox Android Symbolayer重置筛选器   java如何在顶部显示特定的recyclerview项?   java如何在Hibernate中使用@Qualifier   我想计算特定文本webdriver java在多个页面上可用的HTML表中的数据   java捕获Spring MVC REST服务抛出的Jersey REST客户端的异常   java Hibernate flush()影响事务   密钥绑定Java密钥绑定   sonarqube java,sonar,圈复杂度   使用3DES在Java中加密,在SQL Oracle中解密   regex正则表达式在regex101上工作。com,但不是prod   JAVAsql。SQLException:ORA00600:内部错误代码,参数:[12811],[93233]   java H2数据库存储在哪里?   java如何避免在使用Jackson时从JSON字符串反序列化空JSON数组元素