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

arc*_*lix 9 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>
Run Code Online (Sandbox Code Playgroud)

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

压缩机和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')
Run Code Online (Sandbox Code Playgroud)

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

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

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

mja*_*onw 17

尝试一下:

AWS_QUERYSTRING_EXPIRE = 63115200
Run Code Online (Sandbox Code Playgroud)

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