Skip to main content

Multi-tenancy management module for FastAPI with tenant isolation and permission-aware middleware

Project description

tenants2fast-fastapi

🏢 Multi-tenancy management for FastAPI — tenant isolation, JWT-aware middleware, and permission-gated endpoints, all wired up in minutes.

Part of the *2fast-fastapi ecosystem: oauth2fast-fastapipermissions2fast-fastapitenants2fast-fastapi.


Features

  • 🔐 JWT-aware TenantMiddleware — extracts user from Bearer token and sets tenant context automatically on every request
  • 🏗️ Isolated tenant databases — each tenant gets its own PostgreSQL database, created and initialized at runtime
  • 🗂️ Tenant and UserTenant SQLModel models — ready-to-use ORM models with audit timestamps
  • Redis caching — tenant data and user permissions are cached via permissions2fast-fastapi
  • 🔒 require_permission dependency — guard any route with a single line using the RBAC system from permissions2fast-fastapi

Installation

pip install tenants2fast-fastapi

Or with uv:

uv add tenants2fast-fastapi

Quick Start

from fastapi import Depends, FastAPI
from tenant2fast_fastapi import (
    TenantMiddleware,
    get_current_tenant,
    get_current_user,
    require_permission,
)

app = FastAPI()

# 1. Register the middleware
app.add_middleware(TenantMiddleware)

# 2. Use dependencies in your endpoints
@app.get("/me/tenant")
async def my_tenant(tenant=Depends(get_current_tenant)):
    return {"name": tenant.name, "slug": tenant.slug}

@app.get("/reports", dependencies=[Depends(require_permission("/reports", "GET"))])
async def reports(user=Depends(get_current_user)):
    return {"user": user.email}

See examples/basic_usage.py for a more complete example.


Configuration

All settings use the TENANT_ prefix and can be provided via environment variables or a .env file.

Variable Default Description
TENANT_DB_PREFIX tenant_ Prefix for per-tenant database names
TENANT_SUPERUSER_DB__HOSTNAME localhost PG host for superuser operations
TENANT_SUPERUSER_DB__PORT 5432 PG port
TENANT_SUPERUSER_DB__USERNAME postgres PG superuser username
TENANT_SUPERUSER_DB__PASSWORD postgres PG superuser password
TENANT_SUPERUSER_DB__NAME postgres Default DB for superuser connection
TENANT_MAX_TENANT_CONNECTIONS 5 Connection pool size per tenant

In addition, all variables required by oauth2fast-fastapi (JWT, DB connections, mail) and permissions2fast-fastapi (Redis) must be set — see their respective READMEs.


Public API

from tenant2fast_fastapi import (
    Tenant,                   # SQLModel ORM model (table: tenants)
    UserTenant,               # Many-to-many User ↔ Tenant (table: user_tenants)
    TenantMiddleware,         # Starlette BaseHTTPMiddleware
    get_current_tenant,       # FastAPI dependency → Tenant
    get_current_user,         # FastAPI dependency → User (from oauth2fast-fastapi)
    require_permission,       # Dependency factory → checks RBAC + cache
    create_tenant_database,   # async — creates a PG database for a tenant
    get_tenant_engine,        # returns (cached) AsyncEngine for a tenant DB
    initialize_tenant_schema, # async — runs SQLModel.metadata.create_all on tenant DB
)

Development

# Clone and install in editable mode with dev + test dependencies
git clone https://github.com/AngelDanielSanchezCastillo/tenants2fast-fastapi
cd tenants2fast-fastapi
uv sync --group dev --group test

# Copy .env and adjust to your local setup
cp .env .env.local   # or just edit .env directly

# Run tests (requires PostgreSQL + Redis)
uv run pytest tests/ -v

# Build distribution
uv build

Related Packages

Package PyPI Purpose
log2fast-fastapi PyPI Structured logging
pgsqlasync2fast-fastapi PyPI Async PostgreSQL connection manager
mailing2fast-fastapi PyPI SMTP email sender
oauth2fast-fastapi PyPI JWT Auth + User management
permissions2fast-fastapi PyPI RBAC + Redis permission cache

License

MIT © Angel Daniel Sanchez Castillo

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

tenants2fast_fastapi-0.2.3.tar.gz (35.2 kB view details)

Uploaded Source

Built Distribution

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

tenants2fast_fastapi-0.2.3-py3-none-any.whl (40.5 kB view details)

Uploaded Python 3

File details

Details for the file tenants2fast_fastapi-0.2.3.tar.gz.

File metadata

  • Download URL: tenants2fast_fastapi-0.2.3.tar.gz
  • Upload date:
  • Size: 35.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for tenants2fast_fastapi-0.2.3.tar.gz
Algorithm Hash digest
SHA256 e3eddbd49604c889f743d44e4162fac2e1acab9b251fe2c732e077ae67f9c7e0
MD5 ed7df18ea8e13bde2aa6cb712ffe6f7f
BLAKE2b-256 c3de09d7fc1d9be732372167a50a1066b3e761406a12b00ee30128c34de06495

See more details on using hashes here.

File details

Details for the file tenants2fast_fastapi-0.2.3-py3-none-any.whl.

File metadata

File hashes

Hashes for tenants2fast_fastapi-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 cae7b745ee1076577389f40f3c620a1b3264b213aaf1c1c2afd2ea4c81d83512
MD5 4e88686d63e06f053547bd0d2d00cc46
BLAKE2b-256 c3cf6cbd464ab0eaa07a210b6874a91344db7e764d684674e54c6e65151bad38

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