2011-07-07 30 views
10

我使用django staticfiles + django-storages和Amazon S3来托管我的数据。除了每次运行manage.py collectstatic时,所有操作都很好,该命令会将所有文件上载到服务器。Django StaticFiles和Amazon S3:如何检测修改后的文件?

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

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

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

另一种选择:它看起来像我可以分配任意元数据与python-boto我可以把我第一次上传时的本地修改日期。

无论如何,这似乎是一个普遍的问题,所以我想问问别人使用了什么解决方案。谢谢!

回答

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方法中,即使未使用fallback值,也会调用fallback值。我提出要执行的回退给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)) 

现在,在性能上的差异是<,5S从100S 1000个请求


更新4:

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

我想一个解决方案是有一个自定义管理命令或django-storages更新,其中一个文件存储在S3拥有的所有其他文件,这些文件被更新文件通过collectstatic命令随时更新的元数据。

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

+0

你如何使用modified_time方法?只运行./manage.py collecstatic,不适用于我。它使用botos3中的_save方法来保存文件,但它不会随时检查文件是否为新文件。你的解决方案是什么? – duduklein

+0

这似乎不再是真的了:python-dateutil> 2.1现在支持Python 2和3共享的代码库,python-dateutil == 2.1对于我来说可以使用botos3。 –

+0

Hey Yuji;我遇到了这个相同的问题(与S3Boto几千个文件真的很慢的collectstatics)。我想知道你在这个网站上的位置。你能总结一下当前最好的建议来优化这个过程吗?因为你已经花了很多时间来应对这个问题? –

相关问题