1

我正在使用 django-storages 将媒体文件存储在 S3 存储桶中。但是,我偶尔会转换或以其他方式摆弄文件以创建新文件,并且这种摆弄必须实际使用我的服务器上的文件(大部分转换使用进程调用发生)。完成后,我想将文件保存回 S3。

在理想情况下,从本地迁移到 S3 时,我不必对函数进行任何更改。但是,考虑到我必须创建这些中间本地文件来摆弄,我不确定我将如何做到这一点,然后最后知道结果文件(也将存储在本地机器上)需要然后是复制到 S3。

我能想到的最好的方法是使用一对上下文保护,一个用于源文件,一个用于目标文件。源文件将创建一个临时文件,该文件将复制源文件的内容,然后将其使用、操作等。目标文件上下文保护将在 S3 上获取最终所需的目标路径并创建一个临时本地文件,然后在退出时会在 S3 存储桶中创建一个密钥,复制临时文件的内容,然后将其删除。

但这对我来说似乎很复杂。它还要求我将每个操作这些文件的函数包装在两个“with”子句中。

我能想到的唯一其他解决方案是切换到处理类文件对象而不是文件名的实用程序,但这意味着我不能进行子进程调用。

4

1 回答 1

1

看看内置的文件存储 API——这正是它的用例。

如果您使用 django-storages 并上传到 S3,那么您的设置模块中应该有一行看起来像

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

当您在本地开发并且不想将媒体文件上传到 S3 时,在您的本地设置模块中,只需将其保留,使其默认为django.core.files.storage.FileSystemStorage.

在您的应用程序代码中,对于从本地开发转移到暂存时将保存到 S3 的媒体文件,Storage使用从函数返回的类实例化一个对象get_storage_class,并使用该对象来操作文件。对于您“摆弄”的临时本地文件,不要使用此Storage对象(即使用 Python 的内置文件处理函数),除非它是您要保存到 S3 的文件。

当您准备好开始在 S3 上保存内容时,您所要做的就是DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'重新设置,您的代码无需任何其他调整即可工作。如果未设置该设置,这些媒体文件将保存到本地文件系统下MEDIA_ROOT,同样无需更改您的应用程序逻辑。

于 2014-05-28T03:35:56.117 回答