# Динамическая генерация ссылок на медиа ## Проблема При работе с несколькими доменами (локальный и глобальный) статические ссылки на медиа-файлы работали только для одного домена. ## Решение Реализовали динамическую генерацию ссылок на медиа на основе текущего домена запроса. ## Что изменилось ### 1. Context Processor **Файл:** `backend/core/context_processors.py` Добавлен context processor `media_domain()`, который: - Определяет текущий домен из запроса (`request.get_host()`) - Формирует динамический `MEDIA_URL_DYNAMIC` с учётом протокола и домена - Добавляет переменные в контекст всех шаблонов: - `MEDIA_URL_DYNAMIC` — полный URL для медиа (например: `http://localhost:9000/media/` или `https://example.com/media/`) - `CURRENT_DOMAIN` — текущий домен - `CURRENT_SCHEME` — протокол (http/https) ### 2. Настройки Django **Файл:** `backend/eusrr_backend/settings.py` Добавлен context processor в `TEMPLATES`: ```python "context_processors": [ # ... "core.context_processors.media_domain", ], ``` ### 3. Обновлённые шаблоны Все шаблоны обновлены для использования динамических ссылок: #### `backend/templates/feed/_feed_cards.html` - Изображения постов - Аватары авторов - Добавлен `loading="lazy"` и `decoding="async"` для оптимизации #### `backend/templates/feed/feed_list.html` - Аватары новых сотрудников #### `backend/templates/feed/post_detail.html` - Изображения постов в детальном виде - Аватары авторов ## Логика обработки URL Шаблоны проверяют формат URL и обрабатывают его соответственно: ```django {% if img_url|slice:":7" == "/media/" %} {# Относительный путь /media/... → добавляем домен #} ... {% elif img_url|slice:":1" == "/" %} {# Абсолютный путь /... → добавляем схему и домен #} ... {% else %} {# Уже полный URL или внешняя ссылка → используем как есть #} ... {% endif %} ``` ## Примеры работы ### Локальный домен (localhost:9000) ``` Запрос: http://localhost:9000/feed/ MEDIA_URL_DYNAMIC: http://localhost:9000/media/ Файл: /media/feed/images/photo.jpg Результат: http://localhost:9000/media/feed/images/photo.jpg ``` ### Глобальный домен (example.com) ``` Запрос: https://example.com/feed/ MEDIA_URL_DYNAMIC: https://example.com/media/ Файл: /media/feed/images/photo.jpg Результат: https://example.com/media/feed/images/photo.jpg ``` ## Преимущества ✅ **Автоматическая адаптация** — один код работает на всех доменах ✅ **Без перезапуска** — не нужно менять настройки при переключении доменов ✅ **SEO-дружественные URL** — правильные абсолютные ссылки ✅ **Поддержка HTTPS/HTTP** — автоматически определяется из запроса ✅ **Оптимизация загрузки** — добавлены атрибуты `loading="lazy"` и `decoding="async"` ## Дальнейшие улучшения ### Возможные оптимизации: 1. **CDN интеграция** — добавить отдельные CDN домены для статики 2. **Оптимизация изображений** — генерация thumbnails разных размеров 3. **WebP/AVIF форматы** — современные форматы для уменьшения размера 4. **Кэширование** — добавить Cache-Control заголовки 5. **Версионирование** — добавить версии к URL для инвалидации кэша ### Пример с CDN: ```python def media_domain(request): host = request.get_host().split(':')[0] # Определяем CDN на основе домена if host in ['localhost', '127.0.0.1']: cdn_url = f"{request.scheme}://{request.get_host()}/media/" elif 'dev' in host: cdn_url = "https://cdn-dev.example.com/media/" else: cdn_url = "https://cdn.example.com/media/" return {'MEDIA_URL_DYNAMIC': cdn_url} ``` ## Тестирование Проверьте работу на обоих доменах: 1. Откройте ленту на `http://localhost:9000/feed/` 2. Откройте ленту на `https://your-domain.com/feed/` 3. Убедитесь, что изображения загружаются корректно в обоих случаях 4. Проверьте в DevTools, что URLs формируются правильно ## Откат изменений Если нужно вернуться к старому поведению: 1. Удалить `core.context_processors.media_domain` из `settings.py` 2. В шаблонах заменить `{{ MEDIA_URL_DYNAMIC }}{{ img_url|slice:"7:" }}` на `{{ img_url }}`