12

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

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

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

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

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

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

4

2 回答 2

12

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

pip install django-storages你现在很好了 :) 一定要喜欢开源!

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


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


更新 3:我分叉了 django-storages 存储库来解决问题并添加了一个拉取请求。

问题出在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 次请求的 <.5 秒


更新 4:

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

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

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

于 2011-12-09T02:20:08.333 回答
1

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

于 2013-07-08T14:01:23.490 回答