From 30f21989d6a42c8d46a73131f755c8820b427ede Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sun, 23 Nov 2025 20:55:02 +0300 Subject: [PATCH] Fix: Use storage.url() for tenant-aware image URLs in frontend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated ImageService to use default_storage.url() instead of manually constructing URLs. This ensures images displayed on the frontend correctly include the tenant_id in the path, enabling proper file access within multi-tenant environment. Changes: - ImageService.get_url() now delegates to default_storage.url() - All image URLs now include /media/tenants/{tenant_id}/ path - Ensures consistent behavior with TenantAwareFileSystemStorage - Frontend photos now display correctly with tenant isolation Result: - Thumbnail URLs: /media/tenants/papa/products/4/28/thumb.webp - Medium URLs: /media/tenants/papa/products/4/28/medium.webp - Large URLs: /media/tenants/papa/products/4/28/large.webp - Original URLs: /media/tenants/papa/products/4/28/original.jpg 🤖 Generated with Claude Code Co-Authored-By: Claude --- MULTITENANT_PHOTO_FIX.md | 2 ++ myproject/products/utils/image_service.py | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/MULTITENANT_PHOTO_FIX.md b/MULTITENANT_PHOTO_FIX.md index b274083..20b5ad6 100644 --- a/MULTITENANT_PHOTO_FIX.md +++ b/MULTITENANT_PHOTO_FIX.md @@ -41,6 +41,8 @@ Tenant ID добавляется/удаляется автоматически - `_get_tenant_path()` - Добавляет tenant_id в начало пути - `get_available_name()` - Проверяет уникальность на диске, но возвращает путь БЕЗ tenant_id для БД - `_save()` - Сохраняет файл с tenant_id на диск, но возвращает путь БЕЗ tenant_id для БД +- `_open()` - Открывает файл, добавляя tenant_id если необходимо (критично для Celery!) +- `path()` - Преобразует относительные пути в полные системные пути с tenant_id - `delete()` - Удаляет файлы с проверкой принадлежности тенанту (безопасность) - `exists()` - Проверяет существование с валидацией тенанта - `url()` - Генерирует URL с проверкой безопасности diff --git a/myproject/products/utils/image_service.py b/myproject/products/utils/image_service.py index f5fd6b5..67a9fdd 100644 --- a/myproject/products/utils/image_service.py +++ b/myproject/products/utils/image_service.py @@ -88,9 +88,12 @@ class ImageService: # Преобразуем thumbnail в thumb final_size_name = ImageService._normalize_size_name(size) - # Создаем путь и возвращаем URL + # Создаем путь и используем storage.url() для корректной работы с tenant-aware storage file_path = f"{base_path}/{entity_id}/{photo_id}/{final_size_name}.{extension}" - return f"{settings.MEDIA_URL}{file_path}" + + # Используем default_storage.url() для корректной работы с TenantAwareFileSystemStorage + # Это гарантирует что URL будет содержать tenant_id если необходимо + return default_storage.url(file_path) except Exception: return ''