Django - Медиа с нескольких сайтов на одном удаленном сервере
Доброе время суток.
Имеется N сайтов, со своими media файлами, изображения и файлы. Многие из них идентичны. Все сайты на разных серверах и доменах.
Нужно сделать так, чтобы все файлы были расположены на одном удаленном сервере. Важно, чтобы добавление файла на одном сайте не перетерали файлы с другого сайта.
Вопрос - как реализовать?
PS: От монтирования удаленного диска отказались
Достаточно написать свой Storage.
Все что требовалось - написать класс на основе информации из документации.
В __init__
методе Storage
класса указать, откуда будут браться файлы,с локалки или удаленного сервера.
class RemoteStorage(FileSystemStorage):
def __init__(self):
self.REMOTE_FILE_FIELD_ENABLED = getattr(settings, 'REMOTE_FILE_FIELD_ENABLED', None) or False # TODO: Change
self.REMOTE_FILE_FIELD_HOST = getattr(settings, 'REMOTE_FILE_FIELD_HOST', None)
self.REMOTE_FILE_USE_NGINX = getattr(settings, 'REMOTE_FILE_NGINX_MODE', False)
super().__init__()
@property
def local_mode(self):
return self.REMOTE_FILE_FIELD_ENABLED is False
def url(self, name):
url = super().url(name)
if not self.local_mode:
base_url = self.REMOTE_FILE_USE_NGINX is False and self.REMOTE_FILE_FIELD_HOST
if base_url:
url = f'{base_url}{url}'
return url
def _open(self, name, mode='rb'):
if self.local_mode:
return super()._open(name, mode='rb')
else:
return RemoteStorageFile(name=name, storage=self, mode=mode)
def _save(self, name, content):
if self.local_mode:
return super()._save(name, content)
else:
pass
def delete(self, name):
if self.local_mode:
return super().delete(name)
И указать, что в локальном режиме - действуем по умолчанию, как FileSystemStorage
, а в удаленном игнорируем все сохранения, и отдаем ссылку на файл с исходного сервера. Далее будет либо проверка наличия через nginx
или django
. Для проверки на django
можно отправлять HEAD
запрос и сохранять код ответа в кеш.
В принципе, этого достаточно для решения моих задач.