Django StaticFiles和AmazonS3:如何检测修改的文件?

Django StaticFiles和AmazonS3:如何检测修改的文件?,django,amazon-s3,django-staticfiles,Django,Amazon S3,Django Staticfiles,我正在使用django staticfiles+和AmazonS3来托管我的数据。除了每次运行manage.py collectstatic命令时都会将所有文件上载到服务器之外,其他操作都很正常 看起来管理命令比较了Storage.modified_time()中的时间戳,这在django storages的S3存储中没有实现 你们怎么确定S3文件是否被修改了 我可以在数据库中存储文件路径和上次修改的数据。或者有没有一种简单的方法可以从Amazon中提取最后修改的数据 另一个选项:看起来我可以使

我正在使用django staticfiles+和AmazonS3来托管我的数据。除了每次运行
manage.py collectstatic
命令时都会将所有文件上载到服务器之外,其他操作都很正常

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

你们怎么确定S3文件是否被修改了

我可以在数据库中存储文件路径和上次修改的数据。或者有没有一种简单的方法可以从Amazon中提取最后修改的数据

另一个选项:看起来我可以使用
python boto
分配任意元数据,在这里我可以在第一次上传时放置本地修改日期


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

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

pip安装django存储
你现在很好:)一定要热爱开源


更新:如果使用S3Boto类,将设置文件中的
AWS\u PRELOAD\u METADATA
选项设置为
True
,以实现快速同步。如果使用他的S3,请使用预加载的S3类


更新2:运行该命令仍然非常慢


更新3:修复该问题并添加了拉请求

问题出在
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))

现在性能上的差异来自我在这里回答了相同的问题。退房这是一个可插入的Django应用程序,它缓存远程S3文件的ETag,并比较缓存的校验和,而不是每次都执行查找。按照安装说明正常运行
collectstatic
。每次部署平均需要1米30秒到10秒左右。

如何使用修改的时间方法?仅运行./manage.py collectatic,对我不起作用。它使用botos3中的_save方法来保存文件,但它不会在任何时候检查文件是否为新文件。你的解决方案是什么?这似乎不再是真的:python dateutil>2.1现在在共享代码库中同时支持python 2和python 3,python dateutil==2.1在botos3中对我很好;我也遇到了同样的问题(使用S3Boto收集数千个文件的速度非常慢)。我想知道你在这件事上是怎么搞的。你能总结一下你目前优化这个过程的最佳建议吗,因为你显然花了很多时间来解决这个问题?更新3为我解决了主要问题。好了,主存储库已经修复了。这使我的负载从100秒下降到0.5秒。剩下的问题是分页时间。。但是它应该是“可接受的”
AWS\u预加载\u元数据现在是。如果您有一个包含许多文件的S3存储桶,此设置将导致服务器尝试加载所有这些文件的列表,并降低速度,或者在我的情况下导致崩溃。