django-compressor,heroku,s3:请求已过期

时间:2013-04-06 17:29:30

标签: django heroku amazon-s3 django-compressor

我在heroku上使用django-compressor和amazon s3提供静态文件,我一直遇到以下错误,压缩器生成了静态文件的链接。我对压缩机和s3完全不熟悉:

https://xxx.s3.amazonaws.com/static/CACHE/css/989a3bfc8147.css?Signature=tBJBLUAWoA2xjGlFOIu8r3SPI5k%3D&Expires=1365267213&AWSAccessKeyId=AKIAJCWU6JPFNTTJ77IQ

<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<RequestId>FE4625EF498A9588</RequestId>
<Expires>2013-04-06T16:53:33Z</Expires>
<HostId>Fbjlk4eigroefpAsW0a533NOHgfQBG+WFRTJ392v2k2/zuG8RraifYIppLyTueFu</HostId>
<ServerTime>2013-04-06T17:04:41Z</ServerTime>
</Error>

我配置了两个heroku服务器,一个用于登台,一个用于生产。他们每个人都有自己的数据库和s3桶。它们还共享相同的设置文件,所有唯一设置都配置为环境变量。我已经检查过静态文件实际上被推送到各自的存储桶。

压缩机&amp; s3设置如下:

COMPRESS_ENABLED = True
COMPRESS_STORAGE = STATICFILES_STORAGE 
COMPRESS_URL = STATIC_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_OFFLINE = False

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')

每次我在升级或制作时将更新推送到heroku时,我最终遇到了上述问题。有时它发生在一小时后,有时一天,有时一周,有时一旦更新被推出。奇怪的是,如果我将相同的更新推送到两个环境,一个将工作,我将在另一个上得到错误,或者它们将首先工作,一个将在一小时后到期,另一个将在一周内到期。

如果有人能解释发生了什么,我真的很感激。显然,Expires参数会导致问题,但为什么持续时间会随着每次推送而变化,以及什么决定了时间量?你如何改变过期时间?如果您需要更多信息,请与我们联系。

更新:我通过设置AWS_QUERYSTRING_AUTH = False暂时解决了这个问题。似乎没有任何方法可以在查询字符串中设置EXPIRATION TIME,仅在请求标头中使用。

2 个答案:

答案 0 :(得分:17)

尝试一下:

AWS_QUERYSTRING_EXPIRE = 63115200

该值是生成链接时的秒数。

答案 1 :(得分:3)

以防有人遇到同样的问题:

AWS_QUERYSTRING_AUTH = False

这将删除任何到期日等。根据用例并不总是需要到期(如我和其他许多其他用户)。这将允许您删除任何到期日。