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

标签 python django amazon-web-services amazon-s3 django-storage

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

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

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

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

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

最佳答案

看看内置的file storage API - 这正是它的用例。

如果您使用 django-storages 并上传到 S3,那么您的设置模块中应该有一行,如下所示

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

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

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

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

关于python - 当需要本地系统文件时,在 Django/python 中操作和创建 S3 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23899045/

相关文章:

python - 在groupby之后对每个组进行相当复杂的计算

python - 组合列表

amazon-web-services - 是否可以直接从 API Gateway 查询 Amazon RDS 实例?

python - Django 找不到静态文件

amazon-web-services - 如何获取存储在aws存储桶中的对象的存储类别

python - AWS Kinesis 消费者 Python 3.4 Boto

python - 如何将 lambda 简化为通用 python

python - Django - feeds() 处的 TypeError 缺少 1 个必需的位置参数 : 'id'

python - 类型错误 : get_session_auth_hash() missing 1 required positional argument: 'self'

Django:保存用户从 ModelForm 提交的数据以供管理员审查并在以后提交