Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 19, 2016 17:28:14

zillion
Зарегистрирован: 2012-08-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка статики

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

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

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

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

Спасибо!

Офлайн

#2 Янв. 19, 2016 17:45:48

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сборка статики

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



Офлайн

#3 Янв. 19, 2016 17:51:54

zillion
Зарегистрирован: 2012-08-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка статики

FishHook

Да, видел этот компрессор, ну если он сожмет css/js и переназовет, то как быть с картинами?

Офлайн

#4 Янв. 19, 2016 17:56:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сборка статики

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



Офлайн

#5 Янв. 26, 2016 23:47:58

zillion
Зарегистрирован: 2012-08-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка статики

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')

Отредактировано zillion (Янв. 26, 2016 23:53:19)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version