Django StaticFiles和Amazon S3:如何检测修改过的文件?

时间:2011-07-07 22:43:59

标签: django amazon-s3 django-staticfiles

我正在使用django staticfiles + django-storages和Amazon S3来托管我的数据。一切运行良好,除了每次运行manage.py collectstatic时,命令都会将所有文件上传到服务器。

管理命令看起来比较了来自Storage.modified_time()的时间戳,这是在django-storages的S3存储中没有实现的。

你们如何确定S3文件是否被修改过?

我可以在我的数据库中存储文件路径和最后修改过的数据。或者有一种简单的方法从亚马逊拉出最后修改过的数据?

另一种选择:看起来我可以使用python-boto分配任意元数据,我可以在第一次上传时设置本地修改日期。

无论如何,这似乎是一个常见问题,所以我想问一下其他人使用过什么解决方案。谢谢!

2 个答案:

答案 0 :(得分:10)

最新版本的django-storages(1.1.3)通过S3 Boto处理文件修改检测。

pip install django-storages,你现在好了:)得开心吧!

更新:在设置文件中将AWS_PRELOAD_METADATA选项设置为True,以便在使用S3Boto类时具有非常快速的同步。如果使用他的S3,请使用他的PreloadedS3类。


更新2:运行命令的速度仍然非常慢。


更新3:I forked the django-storages repository以解决问题并添加了拉取请求。

问题出在modified_time方法中,即使它没有被使用,也会调用回退值。我将后备移动到if块,仅当get返回None

时才会执行
entry = self.entries.get(name, self.bucket.get_key(self._encode_name(name)))

应该是

    entry = self.entries.get(name)
    if entry is None:
        entry = self.bucket.get_key(self._encode_name(name))

现在,性能差异来自<100秒的1000个请求的<.5s


更新4:

为了同步10k +文件,我相信boto必须发出多个请求,因为S3分页结果会导致5-10秒的同步时间。随着我们获得更多文件,这只会变得更糟。

我认为解决方案是使用自定义管理命令或django-storages更新文件存储在S3上,其中包含所有其他文件的元数据,每当文件更新时都会更新通过collectstatic命令。

它不会检测通过其他方式上传的文件,但如果唯一的入口点是管理命令则无关紧要。

答案 1 :(得分:1)

我在这里回答了同样的问题https://stackoverflow.com/a/17528513/1220706。查看https://github.com/FundedByMe/collectfast。它是一个可插入的Django应用程序,它缓存远程S3文件的ETag并比较缓存的校验和,而不是每次都执行查找。按照安装说明正常运行collectstatic。我花了大约1分30秒到每部署大约10秒。