Skip to main content

Una librería para gestionar multitenancy por schema en FastAPI con soporte síncrono y asíncrono.

Project description

FastAPI Tenant Resolver

PyPI version License: MIT

Una librería simple y robusta para gestionar multitenancy por schema en FastAPI. Diseñada para ser no invasiva y compatible con backends síncronos y asíncronos.

Características

  • Middleware Desacoplado: Lee un header configurable (X-Tenant por defecto) sin bloquear endpoints públicos.
  • Dependencia Inteligente: Una única dependencia get_db que se adapta para requerir un tenant o para acceder a un schema público.
  • Soporte Síncrono y Asíncrono: Factorías separadas para SQLAlchemy estándar y asyncio.
  • Mínima Invasión: Diseñada para integrarse en proyectos existentes con cambios mínimos.

Instalación

pip install servi-tenant-resolver

¿Cómo Funciona?

La librería separa la identificación del tenant de la configuración de la base de datos.

  1. Middleware: Lee el header y guarda el tenant_id en request.state. No falla si el header no existe.
  2. Dependencia: Los endpoints la usan para obtener una sesión de DB. La dependencia lee el tenant_id del request.state y configura el search_path de PostgreSQL. Falla si el tenant es requerido y no se proveyó.

Guía de Uso

Esta es la forma recomendada de integrar la librería en una aplicación FastAPI bien estructurada.

1. En tu main.py (Configuración del Middleware)

# app/main.py
from fastapi import FastAPI
from fastapi_tenant_resolver import create_tenant_middleware

# Puedes personalizar el header si quieres. Por defecto es "X-Tenant".
TenantMiddleware = create_tenant_middleware(header_name="X-Mi-Empresa-Tenant")

app = FastAPI()
app.add_middleware(TenantMiddleware)

# ... incluye tus routers ...

2. En tu archivo de dependencias (ej. app/db/session.py)

Aquí es donde conectas la librería con tu configuración de base de datos.

# app/db/session.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from servi_tenant_resolver import get_bd_session_factory

# ... tu configuración de DATABASE_URL y SessionLocal ...
# engine = create_engine(...)
# SessionLocal = sessionmaker(...)

# Usa la factoría de la librería para crear TU ÚNICA dependencia 'get_db'.
# Pásale tu SessionLocal para que sepa cómo crear sesiones.
get_db = get_bd_session_factory(SessionLocal)

# (Para backends asíncronos, usarías create_async_tenant_session_dependency y tu db_manager)

3. En tus Endpoints

Ahora puedes usar get_db de forma dinámica en cualquier router.

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from app.db.session import get_db # <-- Importas tu dependencia ya configurada

router = APIRouter()

# --- Endpoint Privado (requiere tenant) ---
# Se usa `Depends(get_db)` sin argumentos.
@router.get("/profile")
def get_user_profile(db: Session = Depends(get_db)):
    # Falla con error 400 si no se envía el header del tenant.
    # El search_path ya está configurado para el tenant.
    # ... tu lógica ...

# --- Endpoint Público (administrativo) ---
# Se usa `Depends(get_db(public_access=True))`.
@router.get("/admin/system-status")
def get_system_status(db: Session = Depends(get_db(public_access=True))):
    # No requiere header. No falla.
    # El search_path se establece a 'public'.
    # ... tu lógica para el schema public ...

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

servi_tenant_resolver-0.1.2.tar.gz (5.7 kB view details)

Uploaded Source

Built Distribution

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

servi_tenant_resolver-0.1.2-py3-none-any.whl (4.4 kB view details)

Uploaded Python 3

File details

Details for the file servi_tenant_resolver-0.1.2.tar.gz.

File metadata

  • Download URL: servi_tenant_resolver-0.1.2.tar.gz
  • Upload date:
  • Size: 5.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.4

File hashes

Hashes for servi_tenant_resolver-0.1.2.tar.gz
Algorithm Hash digest
SHA256 920ab7a5ada9b11aeb9c897d60446dd3d8e9fbbbabbf8f405678c3068d1052e2
MD5 341870621f375edc83a3718749032844
BLAKE2b-256 27e66af3b2675fb01963ed1af9d13a89954ff96213cea3ddabf4af3c04568953

See more details on using hashes here.

File details

Details for the file servi_tenant_resolver-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for servi_tenant_resolver-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 18705bf6143cfe225ade97f84a678c2e84a6aad4678a88e8a7c9d2c65d9daf56
MD5 3ff575c4014f755bd0ac33e80268ef55
BLAKE2b-256 2c5c1ffa108c5955e8326bca31ed87e5f0c151f2b903149e7d3118e479a76d8c

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