Quickstart

Initialize the strategy & storage

Initialize the storage backend

from limits import storage
memory_storage = storage.MemoryStorage()
from limits import storage
memory_storage = storage.MemcachedStorage(
    "memcached://localhost:11211"
)
from limits import storage
memory_storage = storage.RedisStorage("redis://localhost:6379/1")

Initialize a rate limiter with the Moving Window Strategy

from limits import strategies
moving_window = strategies.MovingWindowRateLimiter(memory_storage)

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 == moving_window.hit(one_per_minute, "test_namespace", "foo")
assert False == moving_window.hit(one_per_minute, "test_namespace", "foo")
assert True == moving_window.hit(one_per_minute, "test_namespace", "bar")

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

Check without consuming

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

Clear a limit

assert True == moving_window.hit(one_per_minute, "test_namespace", "foo")
assert False == moving_window.hit(one_per_minute, "test_namespace", "foo")
moving_window.clear(one_per_minute, "test_namespace", "foo")
assert True == moving_window.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