Joseph
Joseph

Reputation: 183

Multiple Sites under single Django project

Is it possible and correct to have multiple sites under single django project. So that there will be globally shared sittings file,urls files along with global shared 'apps' for all the sites and a common admin interface for all the sites under the single django project. Each site might have its own setting,urls and templates that will be overridden or imported dynamically into the parent settings file.

Could anyone please tell me how to achieve this using Python2.6 + Django 1.2.1 + Apache2.2 + mod_wsgi. As I am a bit confused with the virtualhost need to be supplied while using the mod_wsgi.

As per the above requirement I am planning to keeping the wsgi file in the main django project directory so that the main settings will be imported and within the main setting I am planning to import the requested sites settings dynamically.Is it possible this way using Apache + mod_wsgi. Please advice.

OR

Instead of global django project do I have to make a globally shared module for importing the global setting and url details into site specific settings and urls.

I would like to make better reuse of the code rather than making redundant changes in each sites.

Please advice.

Upvotes: 8

Views: 9836

Answers (2)

andrewmu
andrewmu

Reputation: 14534

Yes, this is entirely possible. The sites can even share data.

The sites framework enables this - for documentation, see here:

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

Upvotes: 7

teewuane
teewuane

Reputation: 5734

This following is the same way that I did it. I borrowed from http://michal.karzynski.pl/blog/2010/10/19/run-multiple-websites-one-django-project/

Basically, you'll create a virtualhost entry on your http.conf file for each domain.

# Virtual hosts setup
NameVirtualHost *
<VirtualHost *>
    ServerName example1.com

    WSGIDaemonProcess APPLICATION_NAME processes=5 python-path=/home/USERNAME/webapps/APPLICATION_NAME:/home/USERNAME/webapps/APPLICATION_NAME/lib/python2.6 threads=1
    WSGIScriptAlias / /home/USERNAME/webapps/APPLICATION_NAME/domain1.wsgi
</VirtualHost>

<VirtualHost *>
    ServerName example2.com


    WSGIDaemonProcess APPLICATION_NAME_www processes=5 python-path=/home/USERNAME/webapps/APPLICATION_NAME:/home/USERNAME/webapps/APPLICATION_NAME/lib/python2.6 threads=1
    WSGIScriptAlias / /home/USERNAME/webapps/APPLICATION_NAME/domain2.wsgi
</VirtualHost>

Then you'll want to create two different wsgi files for each domain and put them in the directory that holds your project. The WSGIScriptAlias is the path to the wsgi file so make sure they are the same...

Example Wsgi file:

import os
import sys
from django.core.handlers.wsgi import WSGIHandler

os.environ['DJANGO_SETTINGS_MODULE'] = 'PROJECT_NAME.domain1_settings' # or PROJECT_NAME.domain2_settings
application = WSGIHandler()

Then you'll want to create two extra settings files... so you'll have

settings.py
domain1_settings.py
domain2_settings.py

domain1_settings.py and domain2_settings.py will import settings.py:

example of domain1_settings.py:

from settings import *

SITE_ID = 1

ROOT_URLCONF = 'domain1_urls'

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',

# other apps specific to this domain
)

Finally, you'll want to create the two separate urls files..

domain1_urls.py and domain2_urls.py

domain1_urls.py will be the default for site_id 1, and domain2_urls.py will be the default for site_id 2.

Upvotes: 12

Related Questions