【问题标题】:Django StaticFiles and Amazon S3: How to detect modified files?Django StaticFiles 和 Amazon S3:如何检测修改的文件?
【发布时间】:2011-09-30 20:57:54
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: django amazon-s3 django-staticfiles


    【解决方案1】:

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

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

    更新:如果使用 S3Boto 类,请将设置文件中的 AWS_PRELOAD_METADATA 选项设置为 True 以实现非常快速的同步。如果使用他的 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))
    

    现在性能上的差异是从 100s 到 1000 个请求的 <.5s>


    更新 4:

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

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

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

    【讨论】:

    • 如何使用 modified_time 方法?只运行 ./manage.py collectstatic,对我不起作用。它使用 botos3 中的 _save 方法来保存文件,但它不会随时检查文件是否是新文件。你的解决方案是什么?
    • 这似乎不再正确:python-dateutil >2.1 现在在共享代码库中同时支持 Python 2 和 3,并且 python-dateutil==2.1 对我来说适用于 botos3。
    • 嘿宇治;我遇到了同样的问题(使用带有数千个文件的 S3Boto 的 collectstatics 真的很慢)。我想知道你在哪里得到了这个。您能否总结一下您目前优化此流程的最佳建议,因为您显然已经花了很多时间来解决这个问题?
    • 更新#3 为我解决了主要问题。 AFAIK,主存储库已修复。我的负载从 100 秒缩短到 0.5 秒。剩下的问题是分页时间......但它应该是“可接受的”
    • AWS_PRELOAD_METADATA 现在是 deprecated。如果您有一个包含许多文件的 S3 存储桶,此设置将导致服务器尝试加载所有这些文件的列表并减慢速度,或者在我的情况下崩溃。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2011-11-15
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多