2

我有一个 Django 应用程序,它使用 FileSystemStorage 进行开发,使用 S3BotoStorage 进行暂存和生产。一切正常。我注意到这些系统之间存在一些小的差异:

  1. FileSystemStorage 会将 MEDIA_ROOT 值附加到它保存的任何文件中。S3BotoStorage 默认不会。

  2. 如果我使用 FileField 删除模型实例,S3BotoStorage 将删除 FileField 的文件和文件所在的目录,如果该文件是该目录中的唯一文件。FileSystemStorage 不会删除空目录。

我可以解决这些差异,但它们会在我的代码中添加条件。其中第一个是最简单的——我只是用location=MEDIA_ROOT. 有没有办法以类似的方式处理第二个?我可以配置任一存储类的目录删除行为吗?我应该重写 FileSystemStorage 的删除方法吗?

4

1 回答 1

3

(第 144 行)的代码FileSystemStorage.delete没有我可以看到的任何配置:

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

所以,是的,最简单和最干净的方法可能是重写它的删除方法来额外检查空目录的情况。

于 2012-10-25T17:46:30.330 回答