Как настроить 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.
в основном вам нужно сделать несколько вещей:
- использовать
AWS_IS_GZIPPED = True
- если ваш S3 находится вне нас. Вам нужно создать пользовательский
S3Connection
класс, в котором вы переопределяетеDefaultHost
переменная для вашего url S3. Примерs3-eu-west-1.amazonaws.com
- если вы используете пунктирное имя ведра, например
subdomain.domain.tld
. Вам нужно установитьAWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
- вы должны установить
non_gzipped_file_content = content.file
в своемCachedS3BotoStorage
это
попробуйте это сообщение, которое завершает вышеуказанное решение с некоторыми строками, чтобы исправить проблему, создающую много (кратных) manifest_%.json в Amazon S3. https://stackoverflow.com/a/31545361/1359475