Власна CMS з автозбереженнямБудь-яка форма з data-autosave шле FormData і патчить DOM по [data-bind] — без кнопок «Зберегти». Редагування у виїзних бічних панелях, темна/світла тема через CSS-змінні. Власник клубу веде розклад, тренерів, турніри, блог, ціни та локації самостійно.
1 / 6
40 моделей, 132 маршрути адмінки13 400 рядків Python, 65 HTML-шаблонів, ~7 000 рядків рукописного CSS/JS адмінки, 29 міграцій. Ієрархія сторінок навчання (home → розділ → рівень → літній табір), турніри з дивізіонами й результатами, локації з власним графіком роботи.
2 / 6
Промислова SEO-інфраструктураЄдине джерело JSON-LD (Organization, Website, Course, SportsEvent, FAQPage, LocalBusiness, BlogPosting) з даними прямо з CMS. Динамічний sitemap.xml, покритий тестом на розсинхрон із в’юхами, robots.txt, /llms.txt під AI-краулери, canonical, OG та hreflang.
3 / 6
Безпека контенту від замовникаHTML, який вводить замовник, санітизується через bleach + BeautifulSoup + lxml (захист від stored XSS). Rate-limit на логін і реєстрацію, canonical-host middleware із 301 зі старого домену, CORS, анти-XSS екранування всередині тегів <script>.
4 / 6
SSOT-патерни й «радіус поразки»Розклад дня (schedule_today.py), SEO-дані та статуси турнірів — єдині джерела, які використовуються і в шапці, і на сторінках. Синхронізацію в’юх із sitemap покрито тестом, який падає при розсинхроні.
5 / 6
Автоматизація та швидкодіяSystemd-таймер щодня о 00:05 оновлює статуси турнірів за датами: реєстрація відкрита, закрита або завершено. Зображення проходять авто-ресайз і конвертацію у WebP через Pillow, плюс lazy-loading, preconnect і decoding для швидкого завантаження.
6 / 6