2013-10-07 14 views
8

Potrei usare qualche aiuto per creare un piano di attacco per un progetto su cui sto lavorando.Soluzione multi-tenancy Python/Django

Immaginate che il sito sia destinato a un gruppo che supervisiona gli uffici vendite regionali, distribuiti in tutto il mondo. Lo scopo di questo progetto è di consentire ai superutenti di creare un nuovo sito secondario specifico per ogni ufficio, a un ritmo rapido: i siti vengono aggiunti su base frequente. I sottositi dell'ufficio devono essere interamente contenuti con gli utenti "admin" specifici per tale sito secondario e devono essere CMS user-friendly. Un superutente dovrebbe essere in grado di intervenire e gestire tutti questi sotto-siti dell'ufficio.

Oltre all'istanza del sito secondario dell'ufficio autonomo, è inoltre necessario che ciascun sito secondario gestisca contatti, lead, ecc. E lo memorizzi in un'area centrale per i superutenti.

Ho fatto alcuni siti con Django, ma mai nulla multi-tenant. Vorrei suggerimenti per le tecnologie da utilizzare o tutorial/documentazione che potrebbero essere utili.

Requisiti:

  1. Ogni sotto-sito utilizza la stessa fonte (modelli, JS, funzioni disponibili, ecc), ma può essere modificato in modo da riflettere il contenuto personalizzato che rispetti le mascherine.
  2. Sottodomini assegnati (con un'opzione di utilizzo di un dominio completo) per sito secondario, configurati all'interno del progetto, non in un file di impostazioni hardcoded.
  3. Controlli di accesso utente specifici del sito secondario, oltre ai superutenti che possono accedere a tutti i siti secondari.
  4. La capacità di fornire un CMS "indipendente" per ogni sito secondario. Ad esempio, un amministratore di sottositi vede solo il loro contenuto. La mia preferenza per questo progetto sarebbe django-cms, ma sono aperto a suggerimenti.
  5. Supporto per le app che raccolgono i dati da tutti i siti secondari, ma limitano gli "amministratori" del sottosuolo alla sola visualizzazione dei loro record in quell'app.

Considerando quanto sopra, quale approccio consiglieresti? Sono aperto a riconsiderare le tecnologie, ma mi piacerebbe restare con Python.

risposta

10

C'è una grande app chiamata django-tenant-schemas che utilizza il meccanismo degli schemi di PostgreSQL per creare multi-tenancy.

Quello che si ottiene è specing SHARED_APPS che contengono oggetti condivisi tra tutti gli schemi (sottositi) e TENANT_APPS che contengono oggetti specifici per un sito secondario, ovvero utenti, record ecc. Gli schemi sono completamente isolati l'uno dall'altro .

Ogni schema PostgreSQL è associato a un URL del dominio, in modo che il middleware controlli la parte HOST della richiesta e imposta lo schema della connessione db per adattarne uno.

Inoltre, consente di definire un PUBLIC_SCHEMA_URLCONF, che consente di specificare urlconf programma per pubblico schema - il sito meta che non è legato ad alcun sotto-sito.

+1

Grazie per una rapida risposta! Ho esaminato gli schemi del django-tenant, ma l'unica cosa su cui sono rimasto bloccato è che non sembra offrire alcun aiuto sul lato dell'author delle cose (di cui non ho molta esperienza). Sarebbe difficile creare un ruolo o un gruppo che potrebbe essere limitato a specifici sotto-siti? – kotyy

+0

Se si intende un gruppo di utenti o un ruolo che renderebbe possibile agli utenti in questo gruppo/ruolo accedere ai siti secondari definiti, sarà necessario rendere i modelli di 'SiteUser' condivisi su tutti gli schemi (ad esempio' public'), che conterrebbe, per ogni schema consentito, l'id del modello utente all'interno dello schema. Altrimenti, potresti semplicemente condividere il modello 'Utente' e gestire l'autenticazione in un altro back-end di autenticazione middleware/personalizzato. –

+1

Ci sono rischi per la sicurezza con gli schemi di django-tenant? Un utente può visualizzare i dati al di fuori del suo schema? – Greg

5

Scusate risposta rapida e sporca, ho appena condividere quello che ho fatto per raggiungere multi tenancy:

  • django-tenancy Mi piace l'approccio dell'autore di utilizzare "modello dinamico"
  • django-dynamicsite Questo è dove dinamica SITE_ID basato su dominio sarà collegato ad un conduttore

Entrambe le librerie di cui sopra, quando combinato, è in grado di servire un'istanza django che è multi-conduttore, e flessibile. Quello che voglio dire flessibile qui è: è possibile definire qualsiasi modello, sia esso "titolare" o "globale". Quindi, puoi avere un sito con un utente globale ma un catalogo di prodotti tenant o un tenant + prodotto. Da molte app django che ho provato, questo è il modo più flessibile per ottenere multi tenancy

2

Il CMS Mezzanine basato su Django ha anche multi-tenancy support.

Ha la maggior parte delle funzionalità richieste, ad eccezione dei controlli utente del sito secondario, penso. La pagina di amministrazione può essere separata dal sito per gli utenti amministratori, ma gli utenti normali no.

Tuttavia, se non avete bisogno di un CMS, questo potrebbe essere eccessivo per il vostro caso d'uso, ma volevo menzionarlo qui per completezza.