【问题标题】:Manipulating and creating S3 files within Django/python when local system files are needed当需要本地系统文件时,在 Django/python 中操作和创建 S3 文件
【发布时间】:2014-07-16 22:25:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    

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

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

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

    【讨论】:

    • 我想我的问题并不清楚。例如,我使用存储 API 将 PDF 文件存储在 S3 中。然后我使用命令行在命令行中将它们拆分为单独的 jpeg,然后将生成的文件保存回 S3 上的文件夹。这一切都是现场发生的,而不是作为分期或开发的一部分。我能够通过创建一个在本地系统上创建临时文件的中间类来解决这个问题,然后使用存储 API 将它们保存回 S3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2011-06-13
    • 2013-08-08
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多