Найти - Пользователи
Полная версия: Сборка статики
Начало » Django » Сборка статики
1
zillion
Всем привет, появилась необходимость хранить статику(js/css/img) на Amazon S3 и раздавать через ихний же CDN. Хотелось бы услышать кто как собирает статику.

Что есть сейчас:
Подключил django-storages, в STATICFILES_STORAGE указал storages.backends.s3boto.S3BotoStorage, ну и дополнительные настройки, статика начала загружаться на S3. В принципе все работает за исключением того что при обновлении какого нибудь файла и заливке его на S3 CDN продолжает отдавать старую версию.

Посмотрел на https://dribbble.com/, у них к каждому файлу дописывается его хэш что решает проблему кэша, и что заметил в файлах css имена изображений также с хэшем, то есть по идее они как-то парсят каждый раз css и меняют названия файлов.

Вообщем готов услышать любые предложения (возможно такое проще сделать через какой нибудь JS сборщик?)

Спасибо!
FishHook
zillion
Вообщем готов услышать любые предложения
Посмотрите в сторону минимализации css/js. Вот например есть такой Django Compressor, сожмет ваши скрипты/стили в один файл. При изменении пересожмет и переназовет.
zillion
FishHook

Да, видел этот компрессор, ну если он сожмет css/js и переназовет, то как быть с картинами?
FishHook
zillion
то как быть с картинами
А какие проблемы с картинками, они же не изменяются. Соответственно, по поводу кэширования париться не придется, закэшировались и хорошо.
zillion
FishHook
А какие проблемы с картинками, они же не изменяются.

Спасибо, попробовал этот компрессор. Вроде бы работает, но все равно есть пару вопросов:
1. Сейчас при collectstatic вся статика копируется на S3, хотя js и css нет смысла копировать, так как они собираются в один файл компрессором
2. Где djnago-compressor хранит хэши своих файлов, я так понял в мемкеше? Если да то как быть с тем, если приложение работает на 3 серверах через лоад балансер?

Настройки следующие:

settings.py
AWS_ACCESS_KEY_ID = '***************'
AWS_SECRET_ACCESS_KEY = '******************'
AWS_STORAGE_BUCKET_NAME = '******'
COMPRESS_ENABLED = True
AWS_S3_CUSTOM_DOMAIN = '************.cloudfront.net'
STATIC_URL = 'https://{0}/assets/'.format(AWS_S3_CUSTOM_DOMAIN)
COMPRESS_OFFLINE = True
COMPRESS_URL = STATIC_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_STORAGE = 'CachedS3BotoStorage.CachedStaticS3BotoStorage'
STATICFILES_STORAGE = COMPRESS_STORAGE
AWS_HEADERS = {
    'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
    'Cache-Control': 'max-age=94608000',
}
COMPRESS_OUTPUT_DIR = ''

CachedS3BotoStorage.py
from django.core.files.storage import get_storage_class
from storages.backends.s3boto import S3BotoStorage
class CachedS3BotoStorage(S3BotoStorage):
    """
    S3 storage backend that saves the files locally, too.
    """
    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):
        name = super(CachedS3BotoStorage, self).save(name, content)
        self.local_storage._save(name, content)
        return name
CachedStaticS3BotoStorage = lambda: CachedS3BotoStorage(location='assets')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB