我使用django-storage将媒体文件存储在S3存储桶中。但是,我偶尔会转换或以其他方式摆弄文件来创建新文件,这个小提琴必须使用我服务器上的实际文件(大部分转换都是使用进程调用)。完成后我想将文件保存回S3。
在理想的世界中,从本地移动到S3时,我不需要对我的功能进行任何更改。但是,我不确定如何考虑到我必须创建这些中间本地文件来进行操作,然后最终知道生成的文件(也将存储在本地计算机上)需要然后被复制到S3。
我最好能够使用一对上下文保护,一个用于源文件,一个用于目标文件。源文件将创建一个临时文件,该文件将获取复制的源文件的内容,然后它将被使用,操作等。目标文件上下文保护将只获得S3上的最终所需目标路径并创建一个临时本地文件,然后退出时会在S3存储桶中创建一个密钥,复制临时文件的内容,然后将其删除。
但这对我来说似乎很复杂。它还要求我将每个操作这些文件的函数包装在两个""条款。
我能想到的唯一其他解决方案是切换到仅处理文件类对象而不是文件名的实用程序,但这意味着我无法进行子进程调用。
答案 0 :(得分:1)
看一下内置的file storage API - 这正是它的用例。
如果您正在使用django-storage并上传到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
下的本地文件系统,无需更改应用程序逻辑。