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 запрос и сохранять код ответа в кеш.

В принципе, этого достаточно для решения моих задач.

Вернуться на верх