Как настроить django-compressor и django-staticfiles с помощью Amazon S3?

Я пытаюсь настроить django-компрессор и django-staticfiles чтобы сжатые CSS / Javascript и изображения обслуживались из S3 Amazon.

мне удалось настроить staticfiles, используя S3 в качестве бэкэнда, так что это collectstatic команда отправляет файлы в S3 вместо STATIC_ROOT.

однако при попытке добавить django-compressor к миксу, где все это, кажется, разваливается для меня. После документация on настройка удаленных хранилищ я создал подкласс бэкэнда хранилища,бото, поэтому я скопировал пример to storage.py. Как только я начну использовать этот кэшированный сервер, файлы будут скопированы в static_media, а не S3. После загрузки первой страницы папка кэша появляется на S3 и в папке static_media.

задание STATICFILES_STORAGE и COMPRESS_STORAGE вернуться к нормальному классу S3 boto (storages.backends.s3boto.S3BotoStorage) приводит к статическим активам, собираемым в ведро S3, и нет папка static_media. Однако попытка перезагрузить страницу выдает ошибку:

Caught NotImplementedError while rendering: This backend doesn't support absolute paths.

подсветка {% compress css %} как и тег compressor/base.py как начало.

раздел s3 / staticfiles / compressor моего settings.py:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY ='secret'
AWS_STORAGE_BUCKET_NAME = 'my-bucket'
S3_URL = 'http://my-bucket.s3.amazonaws.com/'

MEDIA_ROOT = 'client_media'
MEDIA_URL = '/media/'
STATIC_ROOT = 'static_media'
STATIC_URL = S3_URL
ADMIN_MEDIA_PREFIX = S3_URL + 'admin/'
STATICFILES_DIRS = (
    join(DIRNAME, 'static'),
)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
)

COMPRESS_ENABLED = True
COMPRESS_URL = S3_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_STORAGE = 'storage.CachedS3BotoStorage'
STATICFILES_STORAGE = COMPRESS_STORAGE

так где же я ошибаюсь? Я что-то неправильно настроил при использовании CachedS3BotoStorage пользовательских хранения может быть?

4 ответов


ваши настройки выглядят правильно. Вы должны сохранить оба STATICFILES_STORAGE и COMPRESS_STORAGE значение storage.CachedS3BotoStorage хотя и не вернуться к storages.backends.s3boto.S3BotoStorage.

по данным этой проблема с django-compressor, проблема заключается в том, как django-staticfiles сохраняет во время процесса collectstatic (используя shutil.copy2). Эта проблема была исправлена в новой версии django-staticfiles, который можно использовать вместо того, который поставляется с Django 1.3.

pip install django-staticfiles==dev

и в settings.py, переключиться на обновленную версию:

STATICFILES_FINDERS = (
    #"django.contrib.staticfiles.finders.FileSystemFinder",
    #"django.contrib.staticfiles.finders.AppDirectoriesFinder",
    "staticfiles.finders.FileSystemFinder",
    "staticfiles.finders.AppDirectoriesFinder",
    "compressor.finders.CompressorFinder",
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    #'django.contrib.staticfiles',
    'staticfiles',
    #...
)

после python manage.py collectstatic опять же, как каталог кэша из django-compressor, так и собранные файлы staticfiles должны отображаться на S3.


используя django_compressor==1.2 работал для меня. Я не уверен, почему вам нужно установить django-staticfiles, однако все версии django_compressor кроме 1.2 имеет эту проблему.


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

в основном вам нужно сделать несколько вещей:

  1. использовать AWS_IS_GZIPPED = True
  2. если ваш S3 находится вне нас. Вам нужно создать пользовательский S3Connection класс, в котором вы переопределяете DefaultHost переменная для вашего url S3. Пример s3-eu-west-1.amazonaws.com
  3. если вы используете пунктирное имя ведра, например subdomain.domain.tld. Вам нужно установить AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
  4. вы должны установить non_gzipped_file_content = content.file в своем CachedS3BotoStorage

это


попробуйте это сообщение, которое завершает вышеуказанное решение с некоторыми строками, чтобы исправить проблему, создающую много (кратных) manifest_%.json в Amazon S3. https://stackoverflow.com/a/31545361/1359475