Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python / Django multi-tenancy solution

I could use some help creating a plan of attack for a project I'm working on.

Imagine that the site is for a group that oversees regional sales offices, distributed around the world. The purpose of this project is to let superusers spin up a new sub-site specific to each and every office, at a fast pace -- sites are added on a frequent basis. The office sub-sites should be wholly contained with "admin" users specific to that sub-site and should be user-friendly CMS. A superuser should be able to step in and manage all of these office sub-sites.

In addition to the self-contained office sub-site instance, there is also a need for each sub-site to manage contacts, leads, etc and store this in one central area for the superusers.

I've done a few sites using Django, but never anything multi-tenant. I'd like suggestions for technologies to use or tutorials/documentation that might be helpful.

Requirements:

  1. Each sub-site uses the same source (templates, JS, available features, etc), but can be modified to reflect custom content within the templates.
  2. Assigned subdomains (with an option of using a fully qualified domain) per sub-site, configured within the project, not in a hardcoded settings file.
  3. Sub-site specific user access controls, in addition to superusers who can access all sub-sites.
  4. The ability to provide an "independent" CMS for each sub-site. i.e., A sub-site admin only sees their content. My preference for this project would be django-cms, but I'm open to suggestions.
  5. Support for apps that pool the data from all the sub-sites, but limit sub-site "admins" to only viewing their records into that app.

Considering the above, what approach would you recommend? I am open to reconsidering technologies, but I would like to stick with Python.

like image 311
kotyy Avatar asked Oct 07 '13 17:10

kotyy


3 Answers

The Django based CMS Mezzanine also has multi-tenancy support.

It has most of the features you requested except the sub-site user controls I think. The admin page can be separated by site for admin users, but the normal users not.

However, if you dont need a CMS this might be an overkill for your use-case, But I wanted to mention it here for completeness.

like image 189
yellowcap Avatar answered Oct 11 '22 02:10

yellowcap


There is a great app called django-tenant-schemas that uses PostgreSQL schemas mechanism to create multi-tenancy.

What you get is specyfing SHARED_APPS that contain objects shared across all the schemas (sub-sites), and TENANT_APPS that contain objects specific for a sub-site, i.e. users, records etc. The schemas are completely isolated from each other.

Each PostgreSQL schema is tied to a domain url, so that middleware checks the HOST part of the request and sets the db connection's schema to appriopriate one.

In addition, it allows you to define a PUBLIC_SCHEMA_URLCONF which allows you to specify urlconf file for public schema - the meta site that is not tied to any sub-site.

like image 33
Maciej Gol Avatar answered Oct 11 '22 00:10

Maciej Gol


Sorry for quick and dirty answer, i just share what i've done to achieve multi tenancy:

  • django-tenancy I like the author's approach of using "dynamic model"
  • django-dynamicsite This is where dynamic SITE_ID based on domain will be linked to a tenant

Both libraries above, when combined, is able to serve a django instance which is multi-tenant, and flexible. What i mean flexible here is: you can define any model whether is it "tenant" or "global". So, you can have a site with global user but per tenant product catalogue, or per tenant + product. From many django app i've tried, this is the most flexible way to achieve multi tenancy

like image 5
ayik Avatar answered Oct 11 '22 01:10

ayik