Quick Start¶
Get drogue running in under 5 minutes.
FastAPI¶
from fastapi import FastAPI
from drogue.adapters.fastapi import DrogueLimiter
app = FastAPI()
limiter = DrogueLimiter(app, default_limits=["100/minute"])
@app.get("/api/data")
@limiter.limit("10/minute")
async def get_data():
return {"data": "value"}
@app.get("/api/heavy")
@limiter.limit("3/minute")
async def heavy_operation():
return {"result": "computed"}
Run it:
No request parameter. No middleware setup. Rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) are injected automatically.
Flask¶
from flask import Flask
from drogue.adapters.flask import DrogueLimiter
app = Flask(__name__)
limiter = DrogueLimiter(app, default_limits=["100/minute"])
@app.route("/api/data")
@limiter.limit("10/minute")
def get_data():
return {"data": "value"}
Django¶
settings.py:
views.py:
from drogue.adapters.django import DrogueRateLimiter
from django.http import JsonResponse
limiter = DrogueRateLimiter()
@limiter.limit("10/minute")
def get_data(request):
return JsonResponse({"data": "value"})
Rate limit strings¶
| String | Meaning |
|---|---|
100/minute |
100 requests per 60 seconds |
10/second |
10 requests per 1 second |
1000/hour |
1000 requests per 3600 seconds |
Combine burst and sustained:
Choosing an algorithm¶
from drogue.core.rules.rule import AlgorithmType
@limiter.limit("100/minute", algorithm=AlgorithmType.TOKEN_BUCKET) # default
@limiter.limit("100/minute", algorithm=AlgorithmType.SLIDING_WINDOW) # most accurate
@limiter.limit("100/minute", algorithm=AlgorithmType.FIXED_WINDOW) # simplest
Next steps¶
- Configuration -- all available options
- FastAPI guide -- deep dive
- Protection -- DDoS detection, auto-ban, trust caching