我正在使用django-storages将媒体文件存储在S3存储桶中。但是,我有时会转换文件或以其他方式摆弄文件以创建新文件,并且这种摆弄必须实际使用服务器上的文件(大多数转换是使用流程调用进行的)。完成后,我想将文件保存回S3。
在理想的世界中,当从本地模式迁移到S3时,无需对功能进行任何更改。但是,考虑到必须创建这些中间的本地文件来摆弄,因此我不确定该如何做,然后最后知道然后需要将生成的文件(也将存储在本地计算机上)保存为复制到S3。
最好使用一对上下文保护器,一个用于源文件,一个用于目标文件。源文件将创建一个临时文件,该文件将复制源文件的内容,然后将其使用,操作等。目标文件上下文防护将仅在S3上获取最终所需的目标路径并创建一个临时本地文件,然后在退出时会在S3存储桶中创建一个密钥,复制临时文件的内容,然后将其删除。
但这对我来说似乎很复杂。它还需要我将处理这些文件的每个函数包装在两个“ with”子句中。
我能想到的唯一其他解决方案是切换到仅处理类似于文件的对象而非文件名的实用程序,但这意味着我无法进行子流程调用。
最佳答案
看一下内置的file storage 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
下的本地文件系统中,而无需再次更改应用程序逻辑。