Как настроить django-компрессор и django-staticfiles с помощью Amazon S3? - PullRequest
29 голосов
/ 08 октября 2011

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

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

Однако, когда я пытаюсь добавить django-compressor к миксу, мне кажется, что все это разваливается. Следуя документации по настройке удаленных хранилищ, я создал подкласс внутреннего хранилища boto , поэтому скопировал пример в storage.py. Как только я начинаю использовать этот кэшированный сервер, файлы копируются в static_media, а не в S3. После загрузки первой страницы папка CACHE появляется на 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 / compress моего 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 ]

10 голосов
/ 11 октября 2011

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

В соответствии с этой проблемой django-compress, проблема заключается вспособ сохранения django-staticfiles во время процесса сбора данных (используя 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 каталог SACHE из django-compress и собранные файлы staticfiles должны появиться на S3.

0 голосов
/ 21 июля 2015

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

0 голосов
/ 06 мая 2015

После многих дней тяжелой работы и исследований я, наконец, смог это сделать, и я решил написать подробное руководство об этом, в том числе о том, как обслуживать их в архиве 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

Это CachedS3BotoStorage класс, который вам нужен:

class CachedS3BotoStorage(S3BotoStorage):
    """
    S3 storage backend that saves the files locally, too.
    """
    connection_class = EUConnection
    location = settings.STATICFILES_LOCATION
    def __init__(self, *args, **kwargs):
        super(CachedS3BotoStorage, self).__init__(*args, **kwargs)
        self.local_storage = get_storage_class(
            "compressor.storage.CompressorFileStorage")()

def save(self, name, content):
    non_gzipped_file_content = content.file
    name = super(CachedS3BotoStorage, self).save(name, content)
    content.file = non_gzipped_file_content
    self.local_storage._save(name, content)
    return name

Обратите внимание, что EUConnection - это пользовательский класс, в котором я установил DefaultHost в моем местоположении S3. Ознакомьтесь с более длинным и подробным руководством по созданию пользовательских хранилищ и настроек.py

0 голосов
/ 09 августа 2013

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

...