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

时间:2014-10-07 13:44:02

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

我使用Amazon S3作为我的webservice的一部分。工作流程如下:

  • 用户将大量文件上传到Web服务器。 Web服务器首先在本地存储它们,然后异步上载到S3
  • 用户发送http请求以启动作业(这是对这些上传文件的处理)
  • Web服务要求工作人员完成工作
  • 工作人员完成工作并将结果上传到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中是否有标准的库类?

2 个答案:

答案 0 :(得分:5)

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

您的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网址与MEDIA_URL中的路径匹配。

答案 1 :(得分:1)

  

我计划在一台机器上部署整个系统,以便在本地运行所有内容

然后停止使用QueuedStorage,因为"[QueuedStorage] enables having a local and a remote storage backend"并且您刚刚说过您不想要遥控器。

只需使用FileSystemStorage并配置nginx即可投放location / settings.MEDIA_ROOT