我使用 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'
此配置的默认存储用于未提供存储 kwarg
的 FileFields
。它也可以像这样访问: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/