Skip to main content

No project description provided

Project description

Robyn Rate Limits

This is an extension for Robyn that allows rate limiting your API.

Installation

You can get robyn-rate-limits from PyPI, which means you can install it with pip easily:

python -m pip install robyn-rate-limits

If you would like to use Redis as a store, enable the redis feature:

python -m pip install robyn-rate-limits[redis]

Usage

Define your API normally as you would with Robyn, and add a limiter middleware:

from robyn import Robyn
from robyn_rate_limits import InMemoryStore
from robyn_rate_limits import RateLimiter

app = Robyn(__file__)
limiter = RateLimiter(store=InMemoryStore, calls_limit=3, limit_ttl=100)

@app.before_request()
def middleware(request: Request):
    return limiter.handle_request(app, request)


@app.get("/")
def h():
    return "Hello, World!"

app.start(port=8080)

Stores

Robyn Rate Limits supports multiple caching strategies to suit different use cases, both in-memory and Redis-based:

In-Memory Stores

1. Sliding Window (Default)

from robyn_rate_limits import InMemoryStore

limiter = RateLimiter(store=InMemoryStore, calls_limit=3, limit_ttl=100)

2. Fixed Window

from robyn_rate_limits import InMemoryFixedWindowStore

limiter = RateLimiter(store=InMemoryFixedWindowStore, calls_limit=3, limit_ttl=100, window_size=60)

3. Token Bucket

from robyn_rate_limits import InMemoryTokenBucketStore

limiter = RateLimiter(store=InMemoryTokenBucketStore, calls_limit=3, refill_rate=1, capacity=5)

Redis-based Stores

To use Redis-based stores, first establish a Redis connection:

import redis

redis_conn = redis.Redis(host='localhost', port=6379, db=0)

1. Redis Sliding Window

from robyn_rate_limits import RedisStore

limiter = RateLimiter(store=RedisStore, calls_limit=3, limit_ttl=100, redis=redis_conn)

2. Redis Fixed Window

from robyn_rate_limits import RedisFixedWindowStore

limiter = RateLimiter(store=RedisFixedWindowStore, calls_limit=3, limit_ttl=100, window_size=60, redis=redis_conn)

3. Redis Token Bucket

from robyn_rate_limits import RedisTokenBucketStore

limiter = RateLimiter(store=RedisTokenBucketStore, calls_limit=3, refill_rate=1.0, capacity=5, redis=redis_conn)

Choose the appropriate store based on your application's needs:

  • Use the Sliding Window for a balance between accuracy and performance.
  • Use Fixed Window for simplicity and when precise timing isn't critical.
  • Use Token Bucket when you want to allow short bursts of traffic.
  • Use Redis-based stores for distributed systems or when you need persistence.

The extension is designed in a way that you can implement your own store if you would like to use a different store or algorithm.

Identity

The identity of the client that the rate is limited by is automatically detected:

  • For endpoints that require authentication, the rate is enforced by token.

  • For endpoints that are open, the rate is enforced by IP.

How to contribute

If you add more stores or algorithms and would like them to be part of the official package you are more than welcomed to!

Please read the contributing guide for the guidelines.

Feel free to open issues if you have any question or suggestion.

Local development

  1. Install the development dependencies: uv sync --group dev

  2. Install the pre-commit git hooks: pre-commit install

  3. Run uv run test_server. This will run a server containing several examples of routes we use for testing purposes. You can see them at tests/base_routes.py. You can modify or add some to your likings.

You can then request the server you ran from an other terminal. Here is a GET request done using curl for example:

curl http://localhost:8080/darwin/11/test
# 200
curl http://localhost:8080/darwin/11/test
# 200
curl http://localhost:8080/darwin/11/test
# 200
curl http://localhost:8080/darwin/11/test
# 429

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

robyn_rate_limits-0.4.0.tar.gz (53.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

robyn_rate_limits-0.4.0-py3-none-any.whl (7.0 kB view details)

Uploaded Python 3

File details

Details for the file robyn_rate_limits-0.4.0.tar.gz.

File metadata

  • Download URL: robyn_rate_limits-0.4.0.tar.gz
  • Upload date:
  • Size: 53.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.22

File hashes

Hashes for robyn_rate_limits-0.4.0.tar.gz
Algorithm Hash digest
SHA256 ed0100b152b4397002ac9bb579f29e44ad1814abda12c98d6787179945f3631b
MD5 5bad805e45c006e3a7803c538890df45
BLAKE2b-256 0fb168dc63b06d2757d9c7ebcf5bb03350fd26b8a0c720e34c186a2c8c82cb6f

See more details on using hashes here.

File details

Details for the file robyn_rate_limits-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for robyn_rate_limits-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e039a92ff6378e2266fdc7f16f18539a8024a85186c98ae017a01db3b58ce140
MD5 13e4b4fe773a313ec600082c168614bd
BLAKE2b-256 9bbecf35cea8c89c1facfcc0988dab498fd7bd446467d6c65519442b7f9e4ba9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page