Django-compressor / django-storages链接被错误地缓存;到期

时间:2012-09-18 19:12:01

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

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

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

然而,每小时一次链接断开,网站没有更多样式或JS。看起来链接或至少是expires标头正在被缓存而不是重新生成,因此在expires参数传递的时间过后,Amazon不再返回该文件。如果我刷新内存缓存,它会将链接中的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左右(即Unix时间1347993542,来自URL中的expires参数),该链接停止工作并发回“过期”XML消息(与现在相同)。但是我的页面上仍然存在错误的链接,直到我刷新memcache。

以下是相关设置:

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>

1 个答案:

答案 0 :(得分:2)

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

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

如果您确实需要重新生成链接,请找到它存储在memcache中的位置,并将您发送的相同缓存时间设置为亚马逊的链接到期时间(从django-compressor文档判断它应该是{ {1}})。