Ошибки кеширования ссылок Django-compress / django-storerages; истекающий

У меня есть установка Heroku с django-compressor, сжимающим мои файлы CSS и JS. Мой бэкэнд кеширования по умолчанию настроен с помощью memcached (на самом деле Memcachier на Heroku). Мои статические файлы обслуживаются в экземпляре Amazon S3 (обрабатываются хранилищами django и бото). Обычно мои настройки соответствуют этой из документации django-compressor.

На моих страницах ссылки на мои сжатые файлы имеют запрос «истекает», который кажется через час после создания ссылки. Я не хочу, чтобы у меня не было срока действия для всех запросов CSS или JS, потому что у меня есть некоторые CSS и JS, которые я не сжимаю (это дает мне ошибки, когда я пытаюсь ... вероятно, другой вопрос).

Однако раз в час ссылки прерываются, и на сайте больше нет стилей или JS. Похоже, что ссылка или, по крайней мере, заголовок expires кэшируется, а не регенерируется, поэтому по истечении времени в аргументе expires Amazon больше не возвращает файл. Если я сброшу кэш памяти, он изменит заголовок expires в ссылке на час после этого, что решит проблему на час, пока не истечет срок его действия снова.

Вот пример ссылки, созданной около 13:39 EST сегодня, вторник, 18 сентября: https://zen180-static.s3.amazonaws.com/CACHE/css/68d31794a646.css?Подпись=и/=&TxeF7LBBZTDV79YovOjoK2tcwИстекает=1347993542&AWSAccessKeyId=AKIAIJ7VKLEX7HIMJZCA»отн=. После первого создания страница продолжает обслуживать эту ссылку без изменений. Примерно в 2:39 EST (то есть время Unix 1347993542 из аргумента expires в URL-адресе) эта ссылка перестала работать и отправила обратно XML-сообщение «Expired» (то же самое, что и сейчас). Но плохая ссылка все еще была на моей странице, пока я не сбросил кэш памяти.

Вот соответствующие настройки:

COMPRESS_ENABLED = True

STATICFILES_STORAGE = '[my app's name].storage.CachedS3BotoStorage' (a subclass of S3BotoStorage that is almost identical to the one from django-compressor's docs linked above)

COMPRESS_STORAGE = STATICFILES_STORAGE

COMPRESS_URL = STATIC_URL

CACHES = {
  'default': {
    'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
    'LOCATION': 'localhost:11211',
    'TIMEOUT': 500,
    'BINARY': True,
  }
}

Вот ошибка:

<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<RequestId>81A63F24378ECB5E</RequestId>
<Expires>2012-09-18T18:39:02Z</Expires>
<HostId>lIr5l9Fna95DUfk6hUsWqhO5EQNn6Ayu8BatpEavis8YzLvsaJRru4O8P/50pgMy</HostId>
<ServerTime>2012-09-18T18:59:51Z</ServerTime>
</Error>

person Daniel Robinson    schedule 18.09.2012    source источник
comment
рассматривали ли вы возможность публичного доступа к вашим статическим файлам на S3?   -  person Julian    schedule 26.09.2012
comment
Да, именно так я и поступил. Но я бы хотел, чтобы заголовки истекали, чтобы браузер мог кэшировать страницу.   -  person Daniel Robinson    schedule 26.09.2012


Ответы (1)


Если вы хотите, чтобы браузер кэшировал ваш статический контент, установите settings.AWS_HEADERS соответственно (как указано в лучших предложениях Amazon практики):

AWS_HEADERS = {
    'Expires': 'Sun, 19 Jul 2020 18:06:32 GMT'
}

Если вам действительно нужно регенерировать ссылку, найдите место, где она хранится в кэше памяти, и установите такое же время кеширования, которое вы отправляете, как время истечения срока действия ссылки в Amazon (судя по django-compressor документам, это должно быть одно из settings.COMPRESS_*_DELAY).

person patrys    schedule 27.09.2012