Настройка мультисайтовості Wagtail
Wagtail підтримує кілька сайтів в рамках однієї установки. Один Django-проект, одна база даних, одна адміністративна панель, але різні домени з незалежними деревами сторінок. Архітектура підходить для холдингів з кількома брендами, агенцій, що управляють сайтами клієнтів.
Як влаштована мультисайтовість у Wagtail
Wagtail зберігає конфігурацію сайтів у таблиці wagtailcore_site. Кожна запис містить:
-
hostname— домен -
port— порт (80/443) -
root_page— корневу сторінку дерева цього сайту -
is_default_site— прапорець сайту за замовчуванням
При запиті Wagtail дивиться на Host заголовок і вибирає потрібний сайт.
Базова настройка через адміністративну панель
- Створюємо корневу сторінку для кожного сайту (зазвичай
HomePage) - Додаємо запис у Sites з потрібним доменом і указуємо корневу сторінку
- Повторюємо для кожного домена
Для локальної розробки з кількома доменами прописуємо у /etc/hosts:
127.0.0.1 brand-a.local
127.0.0.1 brand-b.local
Програмна настройка через data migration
Для відтворюваної настройки:
# migrations/0002_multisite_setup.py
from django.db import migrations
def create_sites(apps, schema_editor):
Site = apps.get_model('wagtailcore', 'Site')
Page = apps.get_model('wagtailcore', 'Page')
brand_a_root = Page.objects.get(slug='brand-a')
brand_b_root = Page.objects.get(slug='brand-b')
Site.objects.filter(is_default_site=True).update(
hostname='brand-a.example.com',
root_page=brand_a_root,
)
Site.objects.create(
hostname='brand-b.example.com',
port=443,
root_page=brand_b_root,
site_name='Brand B',
is_default_site=False,
)
class Migration(migrations.Migration):
dependencies = [('website', '0001_initial')]
operations = [migrations.RunPython(create_sites, migrations.RunPython.noop)]
Мультисайтові настройки
BaseSiteSetting прив'язує настройки до конкретного сайту:
from wagtail.contrib.settings.models import BaseSiteSetting, register_setting
@register_setting
class BrandSettings(BaseSiteSetting):
logo = models.ForeignKey('wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL)
primary_color = models.CharField(max_length=7, default='#000000')
footer_text = models.TextField(blank=True)
panels = [
FieldPanel('logo'),
FieldPanel('primary_color'),
FieldPanel('footer_text'),
]
class Meta:
verbose_name = 'Настройки бренда'
У шаблонах:
{% load wagtailsettings_tags %}
{% get_settings %}
<style>:root { --primary: {{ settings.website.BrandSettings.primary_color }}; }</style>
Nginx роутинг
upstream wagtail {
server 127.0.0.1:8000;
}
server {
listen 443 ssl;
server_name brand-a.example.com;
location / {
proxy_pass http://wagtail;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
}
}
Контроль доступу редакторів
from django.contrib.auth.models import Group
from wagtail.models import GroupPagePermission
def setup_brand_editors(brand_root_page, group_name):
group, _ = Group.objects.get_or_create(name=group_name)
GroupPagePermission.objects.get_or_create(
group=group,
page=brand_root_page,
permission_type='change',
)
return group
Терміни
Базова настройка мультисайту на 2–3 домена: 1–2 дні. З кастомними брендовими настройками, управлінням медіа: 3–4 дні.







