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