django压缩机,heroku,s3:请求已过期

django压缩机,heroku,s3:请求已过期,django,heroku,amazon-s3,django-compressor,Django,Heroku,Amazon S3,Django Compressor,我在heroku上使用django compressor,AmazonS3提供静态文件,我在使用compressor生成的指向静态文件的链接时不断遇到以下错误。我对压缩机和s3完全陌生: https://xxx.s3.amazonaws.com/static/CACHE/css/989a3bfc8147.css?Signature=tBJBLUAWoA2xjGlFOIu8r3SPI5k%3D&Expires=1365267213&AWSAccessKeyId=AKIAJCWU6J

我在heroku上使用django compressor,AmazonS3提供静态文件,我在使用compressor生成的指向静态文件的链接时不断遇到以下错误。我对压缩机和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存储桶。它们还共享相同的设置文件,所有唯一的设置都配置为环境变量。我已经检查过静态文件实际上正在被推送到各自的存储桶中

压缩机和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\u QUERYSTRING\u AUTH=False临时解决了这个问题。似乎没有任何方法可以在查询字符串中设置过期时间,只能在请求头中使用。

尝试一下:

AWS_QUERYSTRING_EXPIRE = 63115200

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

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

AWS_QUERYSTRING_AUTH = False

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

检查以确保您的服务器的系统时间已更新--我在运行系统时间未同步的VM时收到此错误。我在Heroku上,无法控制系统时间。这起到了作用,但您能否告诉我们更多原因。这是Botto还是django压缩机设置?它在任何地方都有文档记录吗?这是一个boto设置,默认情况下,boto将过期查询字符串放在URL输出上,但它们很短。这一期限延长至两年。我只是通过查看源代码并在互联网站上看到一些对它的引用才发现了它。实际上,更改过期时间的正确方法如威尔金森的回答所述。AWS_QUERYSTRING_AUTH=False禁用epiration peram,这是一个已知的短到期时间问题的工作区。