本地文件系统作为 Django 中的远程存储

Posted

技术标签:

【中文标题】本地文件系统作为 Django 中的远程存储【英文标题】:Local filesystem as a remote storage in Django 【发布时间】:2014-12-01 23:14:18 【问题描述】:

我使用 Amazon S3 作为我的网络服务的一部分。工作流程如下:

用户将大量文件上传到 Web 服务器。 Web 服务器首先将它们存储在本地,然后异步上传到 S3 用户发送 http-request 来启动作业(这是对这些上传文件的一些处理) Web 服务要求工作人员完成工作 Worker 完成工作并将结果上传到 S3 用户向网络服务器请求下载链接,返回somedbrecord.result_file.url 用户使用此链接下载结果

为了处理文件,我使用QueuedStorage 后端。我像这样发起我的FileFields

    user_uploaded_file = models.FileField(..., storage=queued_s3storage, ...)
    result_file = models.FileField(..., storage=queued_s3storage, ...)

其中queued_s3storage 是从...backends.QueuedStorage 派生的类的对象,remote 字段设置为'...backends.s3boto.S3BotoStorage'

现在我计划在一台机器上部署整个系统以在本地运行所有内容,我想用基于我的本地文件系统的东西替换这个 '...backends.s3boto.S3BotoStorage'

第一个解决方法是使用可以在本地“模拟”S3 的 FakeS3。有效,但这并不理想,只是额外的不必要的开销。

我有 nginx 服务器运行并提供来自特定目录的静态文件。如何创建我的“远程存储”类,它实际上在本地存储文件,但提供指向 Nginx 提供的文件的下载链接? (类似于http://myip:80/filedir/file1)。 django 中是否有相应的标准库类?

【问题讨论】:

【参考方案1】:

媒体文件的默认存储后端本地存储。

您的settings.py 定义了这两个环境变量:

MEDIA_ROOT (link to docs) -- 这是本地文件存储文件夹的绝对路径 MEDIA_URL (link to docs) -- 这是网络服务器 HTTP 路径(例如 '/media/''//%s/media' % HOSTNAME

默认存储后端使用这些来保存媒体文件。来自 Django 的默认/全局 settings.py

# Default file storage mechanism that holds media.
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'

此配置的默认存储用于FileFields,未提供存储kwarg。也可以这样访问:rom django.core.files.storage import default_storage


因此,如果您想改变存储以供本地开发和生产使用,您可以执行以下操作:

# file_storages.py
from django.conf import settings
from django.core.files.storage import default_storage
from whatever.backends.s3boto import S3BotoStorage

app_storage = None
if settings.DEBUG == True:
    app_storage = default_storage
else:
    app_storage = S3BotoStorage()

在你的模型中:

# models.py
from file_storages import app_storage

# ...
    result_file = models.FileField(..., storage=app_storage, ...)

最后,您希望 nginx 直接从您的 MEDIA_URL 提供文件。只需确保 nginx URL 与 MEDIA_URL 中的路径匹配即可。

【讨论】:

谢谢! MEDIA_URL 是我一直在寻找的 你提到的那个 HOSTNAME 是嵌入在 django 中的东西?还是我在 settings.py 中指定的我自己的变量?【参考方案2】:

我打算将整个系统部署在一台机器上以在本地运行所有内容

那么请停止使用QueuedStorage,因为"[QueuedStorage] enables having a local and a remote storage backend" 而你刚刚说过你不想要遥控器。

只需使用FileSystemStorage 并配置 nginx 服务于location / settings.MEDIA_ROOT

【讨论】:

当然,我现在根本不需要 QueuedStorage。

以上是关于本地文件系统作为 Django 中的远程存储的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 删除本地和远程存储库中的文件

为什么说本地文件系统不适合作为分布式存储后端

git:使用(本地)远程存储库

Git的使用 —— 版本库

本地文件系统可以作为 SQL Server 外部数据源吗?

linux上如何设置ssh免密登陆