我有一个Django应用程序,它使用FileSystemStorage进行开发,使用S3BotoStorage进行分段和生产。一切都很好。我注意到这些系统之间存在一些细微差别:
FileSystemStorage会将MEDIA_ROOT值附加到任何文件中 扑救。 S3BotoStorage默认不会。
如果我用FileField删除模型实例,S3BotoStorage会 删除FileField的文件和文件所在的目录 file是该目录中唯一的文件。 FileSystemStorage不会 删除空目录。
我可以解决这些差异,但是它们会为我的代码添加条件。第一个是最简单的 - 我只是使用location=MEDIA_ROOT
初始化S3BotoStorage类。有没有办法以类似的方式处理第二个?我可以配置任何存储类的目录删除行为吗?我应该覆盖FileSystemStorage的删除方法吗?
答案 0 :(得分:3)
FileSystemStorage.delete
的代码(第144行)没有我能看到的任何配置:
def delete(self, name):
name = self.path(name)
# If the file exists, delete it from the filesystem.
# Note that there is a race between os.path.exists and os.remove:
# if os.remove fails with ENOENT, the file was removed
# concurrently, and we can continue normally.
if os.path.exists(name):
try:
os.remove(name)
except OSError as e:
if e.errno != errno.ENOENT:
raise
所以,是的,最简单,最干净的方法可能是覆盖其删除方法,以另外检查空目录的情况。