【问题标题】:Django-compressor / django-storages links being wrongly cached; expiringDjango-compressor / django-storages 链接被错误缓存;即将到期
【发布时间】:2012-09-11 02:19:58
【问题描述】:

我有一个使用 django-compressor 压缩我的 CSS 和 JS 文件的 Heroku 设置。我的默认缓存后端是使用 memcached 设置的(在 Heroku 上实际上是 Memcachier)。我的静态文件在 Amazon S3 实例上提供(由 django-storages 和 boto 处理)。一般来说,我的设置符合this one from the django-compressor docs

在我的页面中,指向我的压缩文件的链接有一个“过期”查询,似乎是从生成链接开始的一个小时后。我不想将所有 CSS 或 JS 请求设置为没有过期,因为我有一些我不压缩的 CSS 和 JS(当我尝试时它给了我错误......可能是一个不同的问题)。

但是,每小时链接会中断一次,并且该站点没有更多样式或 JS。看起来链接,或者至少是 expires 标头,正在被缓存而不是重新生成,所以在 expires 参数中的时间过去后,亚马逊不再返回文件。如果我刷新 memcache,它会将链接中的 expires 标头更改为从那时起一个小时,从而解决一个小时的问题,直到它再次过期。

下面是一个链接示例,该链接在 9 月 18 日(星期二)美国东部标准时间今天下午 1:39 左右生成:https://zen180-static.s3.amazonaws.com/CACHE/css/68d31794a646.css?Signature=u%2FTxeF7LBBZTDV79YovOjoK2tcw%3D&Expires=1347993542&AWSAccessKeyId=AKIAIJ7VKLEX7HIMJZCA。首次生成后,该页面将继续提供该链接而无需更改。大约 2:39 EST(即 Unix 时间 1347993542,来自 URL 中的 expires 参数),该链接停止工作并发送回“过期”XML 消息(与现在相同)。但是在我刷新内存缓存之前,我的页面上仍然存在错误链接。

以下是相关设置:

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>

【问题讨论】:

  • 您是否考虑过在 S3 上启用对静态文件的公开访问?
  • 是的,这就是我最终所做的。但我想要过期标头,以便浏览器可以缓存页面。

标签: python django amazon-s3 django-staticfiles django-compressor


【解决方案1】:

如果您希望浏览器缓存您的静态内容,请相应地设置settings.AWS_HEADERS(如Amazon's best practices 中所述):

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

如果您确实需要重新生成链接,请找到它存储在 memcache 中的位置,并将您发送给 Amazon 的链接到期时间设置为相同的缓存时间(从 django-compressor 文档判断它应该是 settings.COMPRESS_*_DELAY 之一)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 2013-05-13
    • 1970-01-01
    • 2013-06-27
    • 2014-06-06
    • 2016-05-11
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多