Formation incluse

Django Multi Locataire

nancy melissa
2 Septembre 2025 · 7,00 min lecture
10
Django
Django Multi Locataire

🌍 Django Multi-tenant : comprendre et mettre en place

🔹 Qu’est-ce que le multi-tenant ?

Le multi-tenant (multi-locataire) est une architecture logicielleune seule application Django est utilisée par plusieurs clients (tenants), mais chaque client a ses données isolées.
En clair, tu n’installes pas une app Django pour chaque client, mais une seule instance partagée, ce qui simplifie la maintenance et l’évolutivité.

👉 Exemple concret :

  • Un SaaS (Software as a Service) de gestion d’école.
  • Chaque école (tenant) utilise la même application Django.
  • Mais l’école A ne doit jamais voir les données de l’école B.

🔹 Deux approches principales en Django

  1. Schéma partagé + filtrage des données

    • Une seule base de données.
    • Toutes les données sont stockées dans les mêmes tables.
    • On ajoute un champ tenant_id (ou organisation_id) à chaque modèle pour savoir à quel locataire appartient la donnée.
    • Avantage : simple à mettre en place.
    • Inconvénient : risque d’erreur si on oublie de filtrer par tenant.
  2. Schéma isolé par tenant

    • Toujours une seule base de données.
    • Mais chaque tenant a son propre schéma PostgreSQL.
    • Exemple : tenant1.users, tenant2.users, etc.
    • Avantage : isolation forte, sécurité renforcée.
    • Inconvénient : plus complexe à gérer.

👉 Pour Django, la solution la plus utilisée est avec PostgreSQL + schémas séparés grâce à des librairies comme :


🔹 Exemple avec django-tenants

1️⃣ Installation

pip install django-tenants

2️⃣ Configuration du settings.py

On définit deux applications :

  • Shared apps : utilisées par tous les tenants (ex. authentification, gestion des domaines).
  • Tenant apps : propres à chaque tenant (ex. modèles métier).
SHARED_APPS = [
    'django_tenants',
    'customers',  # app qui définit les tenants
    'django.contrib.contenttypes',
    'django.contrib.auth',
    'django.contrib.sessions',
]

TENANT_APPS = [
    'django.contrib.contenttypes',
    'django.contrib.auth',
    'myapp',  # tes apps spécifiques
]

INSTALLED_APPS = SHARED_APPS + TENANT_APPS

DATABASE_ROUTERS = (
    'django_tenants.routers.TenantSyncRouter',
)

3️⃣ Modèle Tenant

Dans customers/models.py :

from django_tenants.models import TenantMixin, DomainMixin

class Client(TenantMixin):
    name = models.CharField(max_length=100)
    paid_until = models.DateField()
    on_trial = models.BooleanField(default=True)

class Domain(DomainMixin):
    pass
  • TenantMixin → représente un tenant (client).
  • DomainMixin → lie un tenant à un domaine (ex. school1.monsaas.com).

4️⃣ Migration et création d’un tenant

python manage.py migrate_schemas --shared

Puis dans le shell :

from customers.models import Client, Domain

# Créer un tenant
tenant = Client(schema_name='tenant1', name='École A', paid_until='2026-01-01', on_trial=False)
tenant.save()

# Associer un domaine
domain = Domain(domain='ecolea.localhost', tenant=tenant)
domain.save()

5️⃣ Utilisation

Quand un utilisateur visite ecolea.localhost, Django bascule automatiquement sur le schéma tenant1 et isole ses données.


🔹 Avantages de l’architecture multi-tenant

✅ Mutualisation des ressources (un seul serveur / app Django).
✅ Mise à jour plus facile (on déploie une fois pour tous les clients).
✅ Meilleure isolation des données (surtout avec les schémas PostgreSQL).
✅ Idéal pour les SaaS et plateformes partagées.


🔹 Limites et précautions

⚠️ Complexité de mise en place (surtout pour la gestion des migrations multi-schémas).
⚠️ Risque de fuite de données si le filtrage n’est pas bien géré (dans le modèle "champ tenant_id").
⚠️ Les performances peuvent être affectées si on a des milliers de schémas (PostgreSQL peut devenir lourd).


🚀 Conclusion

Le multi-tenant dans Django est un choix stratégique pour développer un SaaS scalable.

  • Si ton projet est simple ou avec peu de clients → utilise le champ tenant_id.
  • Si tu veux une isolation forte et une vraie sécurité → utilise PostgreSQL + django-tenants.

👉 C’est une approche puissante, mais elle demande de la rigueur dans la conception des modèles et de la base de données.

10

Applaudissez pour montrer votre soutien

nancy melissa

2 Suivez-nous · Rédacteur pour Django