当需要本地系统文件时,在Django/python中操作和创建S3文件

当需要本地系统文件时,在Django/python中操作和创建S3文件,python,django,amazon-web-services,amazon-s3,django-storage,Python,Django,Amazon Web Services,Amazon S3,Django Storage,我使用django存储将媒体文件存储在S3存储桶中。但是,我偶尔会转换或摆弄文件以创建新文件,而这种摆弄必须实际使用服务器上的文件(大多数转换都是通过进程调用进行的)。完成后,我想将文件保存回S3 在理想的情况下,当从本地迁移到S3时,我不必对我的函数做任何更改。但是,考虑到我必须创建这些要处理的中间本地文件,并且最终知道生成的文件(也将存储在本地计算机上)需要复制到S3,我不确定如何执行此操作 最好是使用一对上下文保护,一个用于源文件,一个用于目标文件。源文件one将创建一个临时文件,该文件将

我使用django存储将媒体文件存储在S3存储桶中。但是,我偶尔会转换或摆弄文件以创建新文件,而这种摆弄必须实际使用服务器上的文件(大多数转换都是通过进程调用进行的)。完成后,我想将文件保存回S3

在理想的情况下,当从本地迁移到S3时,我不必对我的函数做任何更改。但是,考虑到我必须创建这些要处理的中间本地文件,并且最终知道生成的文件(也将存储在本地计算机上)需要复制到S3,我不确定如何执行此操作

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

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


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

看看内置的,这正是它的用例

如果您正在使用django存储并上传到S3,那么设置模块中应该有一行

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
当您在本地开发并且不想将媒体文件上载到S3时,在本地设置模块中,只需将其忽略,使其默认为
django.core.files.storage.FileSystemStorage

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


当你准备开始在S3上保存东西时,你所要做的就是再次设置
DEFAULT\u FILE\u STORAGE='storages.backends.s3boto.s3botostrage'
,你的代码将在没有任何其他调整的情况下工作。未设置该设置时,这些媒体文件将保存到本地文件系统的
媒体根目录下,无需更改应用程序逻辑。

我想我的问题不清楚。例如,我使用存储API将PDF文件存储在S3中。然后,我使用命令行在命令行中将它们拆分为单独的JPEG,然后将生成的文件保存回S3上的文件夹。这一切都是现场发生的,而不是作为阶段或开发的一部分。我可以通过创建一个中间类来解决这个问题,该类在本地系统上创建临时文件,然后使用存储API将它们保存回S3。