Skip to main content

Intelligent rate limiting for Flask, FastAPI, and Django — inspired by Fast Rub's WaitManager

Project description

⏱️ WaitManager-Web

Intelligent rate limiting for Flask, FastAPI, and Django — inspired by Fast Rub's WaitManager.

✨ Features

  • 🔌 Plug & Play — Works with Flask, FastAPI, and Django
  • 🧠 Smart Rate Limiting — Low/Medium/High traffic tiers with automatic wait calculation
  • 📊 Per-Channel Tracking — Separate limits for API, login, upload, download, search, signup
  • 🎯 Per-IP Tracking — Track each client separately
  • 🔧 Fully Customizable — Custom channels, custom sleep callback, auto-tracking
  • 🪶 Zero Dependencies — Core module uses only Python stdlib
  • 📦 Optional Dependencies — Install only what you need

📦 Installation

pip install waitmanager-web               # Core only
pip install waitmanager-web[flask]        # + Flask
pip install waitmanager-web[fastapi]      # + FastAPI
pip install waitmanager-web[django]       # + Django
pip install waitmanager-web[all]          # Everything

🚀 Quick Start

Flask

from flask import Flask
from waitmanager.flask import FlaskWaitManager

app = Flask(__name__)
wm = FlaskWaitManager(low_traffic=100, high_wait=2.0, auto_track=True)
wm.init_app(app)

@app.route("/api/data")
@wm.limit(channel="api")
def get_data():
    return {"status": "ok"}

@app.route("/login", methods=["POST"])
@wm.limit(channel="login", max_requests=5, window=300)
def login():
    return {"status": "ok"}

FastAPI

from fastapi import FastAPI, Depends
from waitmanager import WaitManager
from waitmanager.fastapi import RateLimiter

app = FastAPI()
wm = WaitManager(low_traffic=100, high_wait=2.0)
limiter = RateLimiter(wm)

@app.get("/api/data")
async def get_data(_=Depends(limiter.limit("api"))):
    return {"status": "ok"}

@app.post("/login")
async def login(_=Depends(limiter.limit("login", max_requests=5, window=300))):
    return {"status": "ok"}

Django

# settings.py
MIDDLEWARE = [
    "waitmanager.django.WaitManagerMiddleware",
    ...
]

WAITMANAGER_CONFIG = {
    "low_traffic": 100,
    "high_wait": 2.0,
    "auto_track": True,
}
# views.py
from waitmanager.django import limit

@limit(channel="api")
def api_view(request):
    return JsonResponse({"status": "ok"})

@limit(channel="login", max_requests=5, window=300, block=True)
def login_view(request):
    return JsonResponse({"status": "ok"})

⚙️ Configuration

Parameter Type Default Description
low_traffic int 100 Max requests for "low traffic"
medium_traffic int 200 Max requests for "medium traffic"
low_wait float 0.0 Delay for low traffic (seconds)
medium_wait float 0.5 Delay for medium traffic
high_wait float 2.0 Delay for high traffic
time_window float 60.0 Time window (seconds)
auto_track bool False Auto-track every request
per_ip bool True Track per IP address
sleep_callback callable None Custom wait time function
channels list None Custom channel names

🎯 Custom Sleep Callback

def my_logic(channel, messages_count, last_time, **kwargs):
    if channel == "login" and messages_count > 3:
        return 30.0  # 30 second penalty
    return None  # Use default logic

wm = WaitManager(sleep_callback=my_logic)

🧪 Custom Channels

wm = WaitManager(channels=["api", "login", "payment", "export"])

📄 License

MIT © OandONE

🙏 Acknowledgments

Inspired by Fast Rub's WaitManager — the smartest rate limiter for Rubika bots.


"Good software is built on pain. WaitManager was built on Rubika's API." — OandONE

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

waitmanager_web-0.1.1.tar.gz (8.6 kB view details)

Uploaded Source

Built Distribution

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

waitmanager_web-0.1.1-py3-none-any.whl (8.7 kB view details)

Uploaded Python 3

File details

Details for the file waitmanager_web-0.1.1.tar.gz.

File metadata

  • Download URL: waitmanager_web-0.1.1.tar.gz
  • Upload date:
  • Size: 8.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.11.9

File hashes

Hashes for waitmanager_web-0.1.1.tar.gz
Algorithm Hash digest
SHA256 55e0d3693f9aee91956c5fa7821411c1dd9fb8c1966dc4fea1b521a593a941cf
MD5 d1522fd99e572a15f7595e6a5aab1ca8
BLAKE2b-256 c447c2fa185320c861195eb99a82be759390a6aaaa3e0258c645fede792ba1c6

See more details on using hashes here.

File details

Details for the file waitmanager_web-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for waitmanager_web-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6eb88a269b7292d636dc72afb74148404824a342e7878662e7eefd82488e9a01
MD5 cfc7c45188be6c3225dcfc7ecf0830bf
BLAKE2b-256 18b80709ddcf8adfb585afb22b2a7004db1ec6a6509269a5f27661dea911479b

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