Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple sites on Django

I am trying to run a large amount of sites which share about 90% of their code. They are simply designed to query an API and return the results. They will have a common userbase / database but will be configured slightly different and will have different CSS (perhaps even different templating).

My inital idea was to run them as separate applications with a common library but I have read about the sites framework which would allow them to run from a single instance of django which may help to reduce memory usage.

https://docs.djangoproject.com/en/dev/ref/contrib/sites/

My question is, is the site framework the right approach to a problem like this, and does it have real benefits over running separate applications. Initially I thought it was, but not I think otherwise. I have heard the following:

Your SITE_ID is set in settings.py, so in order to have multiple sites, you need multiple settings.py configurations, which means multiple distinct processes/instances. You can of course share the code base between them, but each site will need a dedicated worker / WSGIDaemon to serve the site.

This effeceitly removes any benefit of running multiple sites under one hood, if each site needs a UWSGI instance running.

Alternative ideas of systems:

  • https://github.com/iivvoo/django_layers
  • https://github.com/shestera/django-multisite
  • http://www.huyng.com/posts/franchising-running-multiple-sites-from-one-django-codebase/

I don't know what route to be taking with this.

like image 828
Jimmy Avatar asked Sep 17 '13 09:09

Jimmy


2 Answers

IMHO it comes down to what degree of change is possible, what the impact is, and how likely is it to happen. For example:

They will have a common userbase / database

Are you saying the same people use all the sites? If so then the risk profile will be less severe than if it was different people (say different organizations). Basically (through good appropriate architecture) you want to be de-coupling things so that when one thing changes it doesn't have a massive impact on everything else.

If you run off the same instance then it's easy to update every site at once (say you need to perform a maintenance patch on the base system), but on the other hand that can bite you (one group of users is happy to have the change but others aren't - either because of the functional change or the downtime needed to apply the patch (for example).

Running the same code-base but in different instances is a larger maintenance overhead but removes a lot of risk associated with managing change; the conversation then becomes one of how to most efficiently maintain many instances of the same thing, rather than mapping risk associated with each time you make a change.

like image 127
Adrian K Avatar answered Nov 14 '22 03:11

Adrian K


Actually, you can run those 2 (or more) sites under the same WSGI instance. Depending on your version of Django and the features you need there are some drawbacks (like using threadlocals) but all in all those 2 solutions work pretty well.

Django 1.8+: https://bitbucket.org/levit_scs/airavata

Django <:1.7: https://bitbucket.org/uysrc/django-dynamicsites/overview (but it will probably require some fiddling depending on your version of Django)

What those 2 applications add compared to Django sites framework is the ability to easily serve sites on the same instance according to the domain name.

like image 38
Emma Avatar answered Nov 14 '22 02:11

Emma