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

Yuj*_*ita 11 django amazon-s3 django-staticfiles

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

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

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

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

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

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

Yuj*_*ita 11

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

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

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


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


更新3:我分叉了django-storages存储库来修复问题并添加了一个pull请求.

问题在于modified_time即使没有使用后备值也会被调用的方法.我将回退移动到一个if块,只有在get返回时才执行None

entry = self.entries.get(name, self.bucket.get_key(self._encode_name(name)))
Run Code Online (Sandbox Code Playgroud)

应该

    entry = self.entries.get(name)
    if entry is None:
        entry = self.bucket.get_key(self._encode_name(name))
Run Code Online (Sandbox Code Playgroud)

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


更新4:

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

我想解决方案是有一个自定义管理命令或django-storages更新,其中文件存储在S3上,其中包含所有其他文件的元数据,只要通过collectstatic命令更新文件,就会更新该文件.

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