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

Ale*_*nko 3 python django nginx amazon-s3 amazon-web-services

我将Amazon S3用作Web服务的一部分。工作流程如下:

  • 用户将大量文件上传到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, ...)
Run Code Online (Sandbox Code Playgroud)

queued_s3storage派生的类对象在哪里,...backends.QueuedStorage并且remotefield设置为'...backends.s3boto.S3BotoStorage'

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

第一个解决方法是使用FakeS3,它可以在本地“模拟” S3。可行,但这不是理想的,只是多余的额外开销。

我让Nginx服务器运行并从特定目录提供静态文件。如何创建我的“远程存储”类,该类实际上将文件存储在本地,但是提供了导致Nginx服务的文件的下载链接?(类似http://myip:80/filedir/file1)。在Django中是否有用于该类的标准库类?

pzt*_*ick 8

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

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

默认存储后端使用这些文件来保存媒体文件。从Django的default / global settings.py中

# Default file storage mechanism that holds media.
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
Run Code Online (Sandbox Code Playgroud)

使用此配置的默认存储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()
Run Code Online (Sandbox Code Playgroud)

在您的模型中:

# models.py
from file_storages import app_storage

# ...
    result_file = models.FileField(..., storage=app_storage, ...)
Run Code Online (Sandbox Code Playgroud)

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