Django StaticFiles и Amazon S3: Как обнаружить измененные файлы?

Я использую django staticfiles + django-storages и Amazon S3 для размещения моих данных. Все работает хорошо, за исключением того, что каждый раз, когда я запускаю manage.py collectstatic, команда загружает все файлы на сервер.

Похоже, что команда управления сравнивает временные метки из Storage.modified_time(), которые не реализованы в хранилище S3 из хранилищ django.

Как вы, ребята, определили, был ли изменен файл S3?

Я могу хранить пути к файлам и последние измененные данные в моей базе данных. Или есть простой способ вытащить последние измененные данные из Amazon?

Другая опция: похоже, что я могу назначить произвольные метаданные с помощью python-boto, где я могу поместить локальную измененную дату при первом загрузке.

В любом случае, это похоже на общую проблему, поэтому я хотел бы спросить, какое решение другие использовали. Спасибо!

Ответ 1

Последняя версия django-storages (1.1.3) обрабатывает обнаружение изменений файла через S3 Boto.

pip install django-storages, и теперь у вас все хорошо:) Должен любить открытый исходный код!

Обновление: установите для параметра AWS_PRELOAD_METADATA значение True в файле настроек, чтобы иметь очень быструю синхронизацию при использовании класса S3Boto. Если вы используете его S3, используйте его класс PreloadedS3.


Обновление 2: все еще очень медленно запускать команду.


Обновление 3: Я искал репозиторий django-хранилищ, чтобы исправить проблему и добавил запрос на перенос.

Проблема заключается в методе modified_time, где вызывается резервное значение, даже если оно не используется. Я переместил резервную копию в блок if, который будет выполнен, только если get возвращает None

entry = self.entries.get(name, self.bucket.get_key(self._encode_name(name)))

Должно быть

    entry = self.entries.get(name)
    if entry is None:
        entry = self.bucket.get_key(self._encode_name(name))

Теперь разница в производительности от <.5s для 1000 запросов от 100 секунд


Обновление 4:

Для синхронизации файлов 10k +, я считаю, что boto должен делать несколько запросов, поскольку результаты S3 paginates вызывают 5-10 секундное время синхронизации. Это будет только ухудшаться, поскольку мы получаем больше файлов.

Я думаю, что решение состоит в том, чтобы иметь настраиваемую команду управления или django-storages обновление, где файл хранится на S3, который содержит метаданные всех других файлов, который обновляется всякий раз, когда файл обновляется через collectstatic.

Он не будет обнаруживать файлы, загруженные с помощью других средств, но не имеет значения, единственной точкой входа является команда управления.

Ответ 2

Я ответил на тот же вопрос здесь fooobar.com/info/522097/.... Проверьте https://github.com/FundedByMe/collectfast. Это подключаемое приложение Django, которое кэширует ETag удаленных файлов S3 и сравнивает кешированную контрольную сумму, а не выполняет поиск каждый раз. Следуйте инструкциям по установке и запустите collectstatic как обычно. Это потребовало от меня примерно от 1 миллиона до 10 секунд на развертывание.