65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
"""
|
||
Утилиты для работы с медиа URL
|
||
"""
|
||
from django.conf import settings
|
||
|
||
|
||
def get_media_base_url(request=None):
|
||
"""
|
||
Возвращает базовый URL для медиа-файлов.
|
||
|
||
Приоритет:
|
||
1. Если USE_HTTPS=true и DOMAIN установлен → используем его
|
||
2. Если есть request → используем домен из запроса
|
||
3. Fallback → /media/
|
||
"""
|
||
# Если в настройках указан предпочтительный домен
|
||
use_https = getattr(settings, 'USE_HTTPS', False)
|
||
domain = getattr(settings, 'DOMAIN', None)
|
||
|
||
if domain and domain not in ['127.0.0.1:9000', 'localhost:9000']:
|
||
# Глобальный домен из настроек
|
||
scheme = 'https' if use_https else 'http'
|
||
return f"{scheme}://{domain}/media/"
|
||
|
||
# Используем домен из запроса (для локальной разработки)
|
||
if request:
|
||
return request.build_absolute_uri('/media/')
|
||
|
||
# Fallback
|
||
return '/media/'
|
||
|
||
|
||
def build_media_url(file_field, request=None):
|
||
"""
|
||
Формирует полный URL для медиа-файла.
|
||
|
||
Args:
|
||
file_field: ImageField/FileField объект
|
||
request: HTTP запрос (опционально)
|
||
|
||
Returns:
|
||
str: Полный URL к файлу
|
||
"""
|
||
if not file_field:
|
||
return None
|
||
|
||
# Получаем относительный путь
|
||
if hasattr(file_field, 'url'):
|
||
relative_url = file_field.url
|
||
else:
|
||
relative_url = str(file_field)
|
||
|
||
# Убираем /media/ если есть
|
||
if relative_url.startswith('/media/'):
|
||
relative_url = relative_url[7:]
|
||
elif relative_url.startswith('/'):
|
||
relative_url = relative_url[1:]
|
||
|
||
# Формируем полный URL
|
||
base_url = get_media_base_url(request)
|
||
if not base_url.endswith('/'):
|
||
base_url += '/'
|
||
|
||
return f"{base_url}{relative_url}"
|