Una librería para gestionar multitenancy por schema en FastAPI con soporte síncrono y asíncrono.
Project description
FastAPI Tenant Resolver
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-Tenantpor defecto) sin bloquear endpoints públicos. - Dependencia Inteligente: Una única dependencia
get_dbque se adapta para requerir un tenant o para acceder a un schema público. - Soporte Síncrono y Asíncrono: Factorías separadas para
SQLAlchemyestándar yasyncio. - 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.
- Middleware: Lee el header y guarda el
tenant_idenrequest.state. No falla si el header no existe. - Dependencia: Los endpoints la usan para obtener una sesión de DB. La dependencia lee el
tenant_iddelrequest.statey configura elsearch_pathde 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
920ab7a5ada9b11aeb9c897d60446dd3d8e9fbbbabbf8f405678c3068d1052e2
|
|
| MD5 |
341870621f375edc83a3718749032844
|
|
| BLAKE2b-256 |
27e66af3b2675fb01963ed1af9d13a89954ff96213cea3ddabf4af3c04568953
|
File details
Details for the file servi_tenant_resolver-0.1.2-py3-none-any.whl.
File metadata
- Download URL: servi_tenant_resolver-0.1.2-py3-none-any.whl
- Upload date:
- Size: 4.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18705bf6143cfe225ade97f84a678c2e84a6aad4678a88e8a7c9d2c65d9daf56
|
|
| MD5 |
3ff575c4014f755bd0ac33e80268ef55
|
|
| BLAKE2b-256 |
2c5c1ffa108c5955e8326bca31ed87e5f0c151f2b903149e7d3118e479a76d8c
|