Quickstart

Note

In an async context, simply substitute the imports from limits to limits.aio and use await in the storage and limiter methods.

Initialize the strategy & storage

Initialize the storage backend

Initialize a rate limiter

Describe the rate limit

Initialize a rate limit using the string notation

from limits import parse
one_per_minute = parse("1/minute")

Initialize a rate limit explicitly using a subclass of RateLimitItem

from limits import RateLimitItemPerSecond
one_per_second = RateLimitItemPerSecond(1, 1)

Test the limits

Consume the limits

assert True == limiter.hit(one_per_minute, "test_namespace", "foo")
assert False == limiter.hit(one_per_minute, "test_namespace", "foo")
assert True == limiter.hit(one_per_minute, "test_namespace", "bar")

assert True == limiter.hit(one_per_second, "test_namespace", "foo")
assert False == limiter.hit(one_per_second, "test_namespace", "foo")
time.sleep(1)
assert True == limiter.hit(one_per_second, "test_namespace", "foo")

Check without consuming

assert True == limiter.hit(one_per_second, "test_namespace", "foo")
while not limiter.test(one_per_second, "test_namespace", "foo"):
    time.sleep(0.01)
assert True == limiter.hit(one_per_second, "test_namespace", "foo")

Query available capacity and reset time

assert True == limiter.hit(one_per_minute, "test_namespace", "foo")
window = limiter.get_window_stats(one_per_minute, "test_namespace", "foo")
assert window.remaining == 0
assert False == limiter.hit(one_per_minute, "test_namespace", "foo")
time.sleep(window.reset_time - time.time())
assert True == limiter.hit(one_per_minute, "test_namespace", "foo")

Clear a limit

assert True == limiter.hit(one_per_minute, "test_namespace", "foo")
assert False == limiter.hit(one_per_minute, "test_namespace", "foo")
limiter.clear(one_per_minute, "test_namespace", "foo")
assert True == limiter.hit(one_per_minute, "test_namespace", "foo")

Rate limit string notation

Instead of manually constructing instances of RateLimitItem you can instead use the following Parsing functions.

These functions accept rate limits specified as strings following the format:

[count] [per|/] [n (optional)] [second|minute|hour|day|month|year]

You can combine rate limits by separating them with a delimiter of your choice.

Examples

  • 10 per hour

  • 10/hour

  • 10/hour;100/day;2000 per year

  • 100/day, 500/7days