django collectstatic 与 django-storages 重新复制所有文件
django collectstatic with django-storages recopying all files
我正在使用 django.contrib.staticfiles 和 django-storages 将我的静态文件部署到 Amazon S3。我使用的django版本是1.10.4,django-storages版本是1.5.2.
现在,当我 运行 collectstatic 时,即使本地文件没有变化,它也会将所有文件从本地系统重新复制到 S3。查看collectstatic管理命令代码可以看到:
在方法中 delete_file:
# The full path of the target file
if self.local:
full_path = self.storage.path(prefixed_path)
else:
full_path = None
# Skip the file if the source file is younger
# Avoid sub-second precision (see #14665, #19540)
if (target_last_modified.replace(microsecond=0) >= source_last_modified.replace(microsecond=0) and
full_path and not (self.symlink ^ os.path.islink(full_path))):
if prefixed_path not in self.unmodified_files:
self.unmodified_files.append(prefixed_path)
self.log("Skipping '%s' (not modified)" % path)
return False
在调试时我看到即使 target_last_modified >= source_last_modified 但 full_path 是 None 这就是检查失败并最终删除文件的原因在遥控器上。我不确定我做错了什么,或者我是否错过了某些设置,因为它正在重新上传文件。有趣的是,如果我删除上面代码中的额外检查并像这样检查:
if (target_last_modified.replace(microsecond=0) >= source_last_modified.replace(microsecond=0)):
它工作正常。
我在 SO 上看到过类似的问题,但它们主要是由于 S3 与本地系统的时区不同。在我的例子中,我的本地时区和 S3 存储区都相同。无论如何,上述 hack 表明问题不是由于时区差异造成的。
我们的解决方案是使用 Collectfast
:
https://github.com/jazzband/collectfast
它在上传之前缓存并比较文件的md5校验和。我们很想知道问题的根本原因,但这解决了缓慢问题。
我正在使用 django.contrib.staticfiles 和 django-storages 将我的静态文件部署到 Amazon S3。我使用的django版本是1.10.4,django-storages版本是1.5.2.
现在,当我 运行 collectstatic 时,即使本地文件没有变化,它也会将所有文件从本地系统重新复制到 S3。查看collectstatic管理命令代码可以看到:
在方法中 delete_file:
# The full path of the target file
if self.local:
full_path = self.storage.path(prefixed_path)
else:
full_path = None
# Skip the file if the source file is younger
# Avoid sub-second precision (see #14665, #19540)
if (target_last_modified.replace(microsecond=0) >= source_last_modified.replace(microsecond=0) and
full_path and not (self.symlink ^ os.path.islink(full_path))):
if prefixed_path not in self.unmodified_files:
self.unmodified_files.append(prefixed_path)
self.log("Skipping '%s' (not modified)" % path)
return False
在调试时我看到即使 target_last_modified >= source_last_modified 但 full_path 是 None 这就是检查失败并最终删除文件的原因在遥控器上。我不确定我做错了什么,或者我是否错过了某些设置,因为它正在重新上传文件。有趣的是,如果我删除上面代码中的额外检查并像这样检查:
if (target_last_modified.replace(microsecond=0) >= source_last_modified.replace(microsecond=0)):
它工作正常。
我在 SO 上看到过类似的问题,但它们主要是由于 S3 与本地系统的时区不同。在我的例子中,我的本地时区和 S3 存储区都相同。无论如何,上述 hack 表明问题不是由于时区差异造成的。
我们的解决方案是使用 Collectfast
:
https://github.com/jazzband/collectfast
它在上传之前缓存并比较文件的md5校验和。我们很想知道问题的根本原因,但这解决了缓慢问题。