JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Можно ли использовать одну конфигурацию Django 2 для нескольких доменов сразу (мультидомены)?

Всем доброго времени.
С какого-то времени я стал делать сайты только на Django.
Размещаю их на VPS.
Покупаю домен, прикрепляю. Через GIT заливаю проект.
Далее PostgreSQL, Gunicorn, Supervisor, Nginx под статику, Сертификат https.
Если надо, то Celery + RabbitMQ

Так вот если это сложный проект, где в принципе используется много всего, то я считаю оправданным покупать под это дело целый сервер.

Но очень часто бывает много проектов, где просто простенький корпоративный сайтец или лендинг или витринка какая-нибудь. В общем сайты, где особо то и нагрузки нет никакой. И есть большое желание установить одну конфигурацию Django, но использовать для разных проектов. Ну делаю приложения:
site1, в нём свои шаблоны, вьюхи и если надо даже модели. Это для одного клиента.
site2, в нём свои другие шаблоны, вьюхи и опять же если надо тоже модели. Это для второго клиента.
site3 для третьего
...
и т.д. на сколько сервер в принципе потянет.

А теперь вопрос: Можно ли использовать одну конфигурацию Django 2 для нескольких доменов сразу (мультидомены)?

Не могу нигде найти информацию как это делается. И чтобы именно для Django 2, который на VPS всё это работало. Будьте добры, подкиньте какой-нибудь понятный мануал.

С уважением. Максим
  • Вопрос задан
  • 484 просмотра
Пригласить эксперта
Ответы на вопрос 1
@FulTupFul
Недавно я тоже столкнулся с данной проблемой, только задача была разместить несколько одинаковых магазинов на одном приложении 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 добавил для красивой рассылки в письмах.
Да, мидлу можно было сделать и получше. Нужно добавить какой-нибудь дефолтный хост, в которой будут перенаправляться все запросы не найденные в таблице.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы