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

5

我在我的 Web 服务中使用 Amazon S3。工作流程如下:

  • 用户上传大量文件到 Web 服务器。Web 服务器首先将它们存储在本地,然后异步上传到 S3。
  • 用户发送 HTTP 请求以启动作业(处理这些上传的文件)。
  • Web 服务请求工作进程执行作业。
  • 工作进程执行作业并将结果上传到 S3。
  • 用户从 Web 服务器请求下载链接,返回 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'

第一个解决方法是使用FakeS3,它可以在本地“模拟”S3。虽然可行,但这不是理想的做法,只会增加不必要的额外开销。

我有一个正在运行的Nginx服务器,并从特定目录提供静态文件。如何创建我的“远程存储”类,实际上将文件存储在本地,但提供下载链接,指向由Nginx提供的文件?(例如http://myip:80/filedir/file1)。在Django中是否有标准库类可以实现这个需求?

2个回答

13

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

settings.py定义了以下两个环境变量:

  • MEDIA_ROOT (文档链接) -- 这是本地文件存储文件夹的绝对路径
  • MEDIA_URL (文档链接) -- 这是Web服务器HTTP路径(例如'/media/''//%s/media' % HOSTNAME

默认存储后端使用这些变量保存媒体文件。从Django的默认/全局settings.py中:

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

如果您想在本地开发和生产环境中使用不同的存储方式,可以像这样操作:

此配置的默认存储方式用于没有提供存储kwargFileFields。也可以像这样访问:from 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就是我在找的东西。 - Aleksei Petrenko
你提到的 HOSTNAME 是 Django 中嵌入的东西吗?还是我在 settings.py 中指定的自己的变量? - Aleksei Petrenko

1

当然,现在我完全不需要QueuedStorage了。 - Aleksei Petrenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接