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

2024-09-26 18:09:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用amazons3作为我的web服务的一部分。工作流程如下:

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


Tags: 文件用户服务器webhttps3链接models
2条回答

I'm planning to deploy the whole system on one machine to run everything locally

那就停止使用QueuedStorage,因为{a1}而且你刚刚说你不想要遥控器。在

只需使用^{}并配置nginx来服务location/settings.MEDIA_ROOT

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

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

  • MEDIA_ROOT(link to docs)这是本地文件存储文件夹的绝对路径
  • MEDIA_URL(link to docs)这是web服务器的HTTP路径(例如'/media/'或{}

默认存储后端使用这些文件来保存媒体文件。从Django的默认/globalsettings.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。在


因此,如果您想改变存储以供本地开发和生产使用,可以执行以下操作:

^{pr2}$

在您的模型中:

# models.py
from file_storages import app_storage

# ...
    result_file = models.FileField(..., storage=app_storage, ...)

最后,您希望nginx直接从您的MEDIA_URL为文件提供服务。只需确保nginxurl与MEDIA_URL中的路径匹配。在

相关问题 更多 >

    热门问题