Django StaticFiles и Amazon S3: как обнаружить измененные файлы? - PullRequest
10 голосов
/ 08 июля 2011

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

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

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 09 декабря 2011

Последняя версия django-storages (1.1.3) обрабатывает обнаружение модификации файла с помощью S3 Boto.

pip install django-storages и теперь все хорошо :) Люблю открытый код!

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


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


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

Проблема заключается в методе 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 запросов из 100s </p>


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

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

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

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

1 голос
/ 08 июля 2013

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

...