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

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

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

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

最佳答案

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

您的 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'

此配置的默认存储用于未提供存储 kwargFileFields。它也可以像这样访问: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 中的路径匹配即可。

关于python - 本地文件系统作为 Django 中的远程存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26237500/

相关文章:

python - Django rest 框架验证分页限制和偏移量

amazon-web-services - 用于设置 S3 存储桶默认加密的 CloudFormation 模板

python - 查找列表的任何元素是否在另一个列表中

Python 用循环多重处理一个大列表

python - 在 Pandas 中使用 .map 从字典创建列时省略大括号

javascript - Django jQuery CSRF 修复在 iPad 上不起作用

django - Django TextField和CharField正在剥离空格和空白行

sql - AWS Athena (Presto) OFFSET 支持

amazon-web-services - 我们可以使用 AWS Data Migration Service 从作为源的 Aurora Serverless 进行复制吗?

python - 在提交之前使用 Perforce 触发器更新文件