【问题标题】:changing django-storages backend from from s3 to cloudfiles and dealing with old files将 django-storages 后端从 s3 更改为 cloudfiles 并处理旧文件
【发布时间】:2014-01-21 14:50:17
【问题描述】:

我有一个 django 应用程序,我要迁移到 rackspace。我有一个使用 FileFields 的模型,我正在使用 django-storages 库 s3/boto 后端。我想使用云文件进行存储,并且需要能够提供旧的 s3 内容。

在我提供文件链接的模板页面上,我这样做:

href="{{ static_url }}{{ article.code_archive_file}}"

static_url 是从视图中设置的,等于settings.STATIC_URL。显然这行不通,因为当我从 s3 切换时,settings.STATIC_URL 会发生变化。

我是否需要编写一个脚本来手动将我的所有 s3 文件迁移到 cloudfiles 并检查并更新我的表中的所有 FileFields? (啊)。我宁愿能够更换存储后端并将旧材料留在 s3 存储桶中。

如果我确实需要迁移文件和字段,是否有人已经为此编写了脚本?

额外问题:我在执行此操作时没有遵循哪些最佳实践?我用django才半年左右。

【问题讨论】:

  • 即兴发挥,我建议使用django-cumulus 与 CloudFiles 交互。对于迁移,我强烈建议使用wonton 使用 gevent 快速传输文件。
  • 作为@KyleKelley 建议的替代方案,您可以添加一个try-except-try 模式,该模式将首先尝试从S3 获取文件,如果它得到404,它会从CloudFiles 尝试,如果失败然后文件不在任何地方。我们不得不对 S3 和 Google Cloud Storage 做类似的事情。
  • 另外,我应该说我的意思是纯粹的文件迁移,而不是数据库迁移。这部分听起来很耗时(但可以编写脚本)。
  • 哦。刚开始看 django-storages。看起来 CloudFiles 后端已经过时了(它引用了一个已被弃用的 Mosso CloudFiles 模块)。如果您继续使用 django-storages,我建议使用 libcloud 后端。
  • 感谢指向 django-cumulus 的指针。看起来做一些我想做的事情可能更容易——比如使用多个容器——我不确定如何使用 django-storages 来完成。实际上,也感谢您将我指向 libcloud 后端。如果我坚持使用 django-storages,我可能会改用它。

标签: python django amazon-s3 django-storage cloudfiles


【解决方案1】:

选项 A:您可以在新旧存储上使用稍微不同的路径,并决定从哪里提供文件。我认为某些东西可能是自定义存储类:您创建从 CloudFilesStorage 继承的存储类,并且在覆盖的 url 方法中,它将调用 super(如果文件在新存储中)或从 S3BotoStorage 调用 url 方法(如果文件在旧存储)。

选项 B:您可以将文件移动到云文件。如果您保持路径相似,我认为您实际上不需要更改 DB 中的任何内容。也许你甚至不需要脚本,只需下载文件然后上传(可以使用s3cmd进行下载,cloudfiles可能也有一些上传工具)。

关于最佳实践:您应该使用 media_url 和 DEFAULT_FILE_STORAGE 而不是 static_url 和静态存储。将项目的静态文件(css/js/icons)和上传的媒体分开是个好主意。

【讨论】:

  • 我的 media_url 是基于 static_url 构建的,并且由于 django-storages 的工作方式,两者都有一个基于 s3 存储桶的 url。我更喜欢使用两个存储桶(或容器,用云文件的说法)。
  • 好的。你为什么不这样做?
  • 我正在为 django-storages 使用 boto s3 后端,据我所知,它不支持多个存储桶。我认为解决方案将是切换到 django-cumulus 或查看用于 django 存储的 libcloud 后端是否允许多个存储桶/容器。文档不清楚,所以我需要挖掘。
  • 从来没有听说过,静态和默认存储不仅可以在不同的存储桶上,它们甚至可以使用不同的后端。以this project 为例——对于不同的存储桶,您需要在 STATIC_URL/MEDIA_URL 中使用不同的存储桶名称并将这些存储桶名称传递给存储类(继承它们并覆盖存储桶名称)。一些额外的信息可以在this answer中找到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多