Ratelimit solution for FastAPI
Project description
# ratelimit-fastapi
Library allows to easily create fastapi endpoints protected by ratelimit
Here is a basic example:
from contextlib import asynccontextmanager
from datetime import timedelta
import random
from ratelimit.ranking.redis import RedisRanking
from fastapi import FastAPI, Depends, Request
from ratelimit.store.redis import RedisStore
from redis.asyncio import Redis
from ratelimit import (
RateLimitErrorResponse,
ratelimit,
LimitRule,
setup_app,
BaseUser,
)
# Setup redis connection
redis = Redis.from_url("redis://localhost:6379/1")
# Define user model that will be stored by library. This data is stored for
# determining user's rank
class User(BaseUser):
address: str
# Unique id is required to be defined, and it must be unique for each user
@property
def unique_id(self):
return self.address
# Define authentication function, here you need to create instance of a model.
# This function is used as a dependency, so it can use all dependencies, that
# can be used in FastAPI
def auth_func(request: Request):
return User(address=request.client.host, group="user")
@asynccontextmanager
async def lifespan(fastapi: FastAPI):
# Setup ratelimit
setup_app(
fastapi,
ranking=RedisRanking(redis, User), # Ranking stores user's ranks
store=RedisStore(redis), # Store stores endpoint related data
authentication_func=auth_func, # Register authentication function
)
yield
app = FastAPI(lifespan=lifespan)
@app.get(
"/",
dependencies=[
Depends(
ratelimit( # Create ratelimiting dependency
LimitRule( # Define ratelimiting rule
hits=120, # Max 120 requests
batch_time=timedelta(
minutes=1
).total_seconds(), # Per 1 minute
block_time=timedelta(minutes=5).total_seconds(), # Time to block user for
),
LimitRule( # Here can be multiple levels of the limiting rules, named "ranks"
hits=120,
batch_time=timedelta(minutes=1).total_seconds(),
block_time=timedelta(minutes=10).total_seconds(),
),
( # And rules can be grouped to be in one rank
LimitRule(
hits=120,
batch_time=timedelta(minutes=1).total_seconds(),
block_time=timedelta(minutes=5).total_seconds(),
),
LimitRule(
delay=timedelta(
seconds=15
).total_seconds(), # This rule may allow access only if between requests are delay in 15 seconds or more
block_time=timedelta(minutes=1).total_seconds(),
),
),
)
)
],
responses={
429: {"model": RateLimitErrorResponse}
}, # Set response model, to see the correct error schema
)
# Define endpoint as usual
def home(a: int = 10, b: int = 30):
if a > b:
a, b = b, a
if a == b:
a, b = 10, 30
return {"random_value": random.randint(a, b)}
More examples at "examples" directory :3
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
ratelimit_fastapi-1.1.2.tar.gz
(25.9 kB
view details)
Built Distribution
File details
Details for the file ratelimit_fastapi-1.1.2.tar.gz
.
File metadata
- Download URL: ratelimit_fastapi-1.1.2.tar.gz
- Upload date:
- Size: 25.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.11.2 Linux/6.1.0-26-amd64
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6095352742c619159fe6e3088cd66df76f490da797f5781342495b1e68b1a789 |
|
MD5 | a314d1d4345cd09078c56c45206b8db5 |
|
BLAKE2b-256 | d301dd2e9042fbb83bfcaaa1106bd7fa7783d8317aced2e44a776285aac23554 |
File details
Details for the file ratelimit_fastapi-1.1.2-py3-none-any.whl
.
File metadata
- Download URL: ratelimit_fastapi-1.1.2-py3-none-any.whl
- Upload date:
- Size: 24.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.11.2 Linux/6.1.0-26-amd64
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 01c3945c18478545e5e893269eedfa16829f960278dd128b906901d4aec8093f |
|
MD5 | 2f2f2819f09363cac51463c1a984fc98 |
|
BLAKE2b-256 | 206175e550fbcd5699aadfd7d700e807c4bc20f7e8b3fbdb31a50c4c5ed858e6 |