Недавно я тоже столкнулся с данной проблемой, только задача была разместить несколько одинаковых магазинов на одном приложении Django.
settings.py:
INSTALLED_APPS = [
.....
'django.contrib.sites',
]
MIDDLEWARE = [
'django.middleware.common.CommonMiddleware',
'app_name.middleware.multisite.DomainRouterMiddleware',
..............
]
models.py:
class Site(models.Model):
"""
Модель в которой будут храниться подключаемые сайты
"""
domain = models.CharField("Домен", max_length=120)
name = models.CharField("Имя", max_length=320)
appname = models.CharField("Имя приложения", validators=[_appname_validator], max_length=120)
objects = SiteManager()
def __str__(self):
return self.name
class Meta:
db_table = "site"
verbose_name = "Сайт"
verbose_name_plural = "Сайты"
ordering = ('domain',)
multisite.py
class DomainRouterMiddleware(object):
"""
Middleware в которой происходит редирект на нужный urlconf.
Пример: Есть объект < 'Site' domain="example.com", name='Example', appname='example'>
При запросе на сайт example.com пользователь будет перенаправлен в приложение example в модуль example.urls
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
host = request.get_host() # Получаем имя доменна в запросе
site = Site.objects.get(domain=host) # Пытаемся найти данный домен в django sites
request.urlconf = '%s.urls' % site.appname # Перенаправляем пользователя в нужный url конфиг
return self.get_response(request)
Потом регистрируем домены:
Site.objects.create(domain="example.com", name='Example', appname="example")
P.S.
Знаю что существует модуль Django sites, но я захотел так.
Поле name добавил для красивой рассылки в письмах.
Да, мидлу можно было сделать и получше. Нужно добавить какой-нибудь дефолтный хост, в которой будут перенаправляться все запросы не найденные в таблице.