我正在使用django staticfiles + django-storages和Amazon S3来托管我的数据。一切运行良好,除了每次运行manage.py collectstatic
时,命令都会将所有文件上传到服务器。
管理命令看起来比较了来自Storage.modified_time()
的时间戳,这是在django-storages的S3存储中没有实现的。
你们如何确定S3文件是否被修改过?
我可以在我的数据库中存储文件路径和最后修改过的数据。或者有一种简单的方法从亚马逊拉出最后修改过的数据?
另一种选择:看起来我可以使用python-boto
分配任意元数据,我可以在第一次上传时设置本地修改日期。
无论如何,这似乎是一个常见问题,所以我想问一下其他人使用过什么解决方案。谢谢!
答案 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
为了同步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秒。