Python 本地文件系统作为Django中的远程存储
我使用AmazonS3作为我的Web服务的一部分。工作流程如下所示:Python 本地文件系统作为Django中的远程存储,python,django,amazon-web-services,nginx,amazon-s3,Python,Django,Amazon Web Services,Nginx,Amazon S3,我使用AmazonS3作为我的Web服务的一部分。工作流程如下所示: 用户将大量文件上传到web服务器。Web服务器首先将它们存储在本地,然后异步上传到S3 用户发送http请求以启动作业(这是对这些上载文件的一些处理) Web服务要求工作人员执行此工作 Worker执行此任务并将结果上载到S3 用户从web服务器请求下载链接,返回somedbrecord.result\u file.url 用户使用此链接下载结果 要处理文件,我使用QueuedStoragebackend。我像这样启动我的
- 用户将大量文件上传到web服务器。Web服务器首先将它们存储在本地,然后异步上传到S3
- 用户发送http请求以启动作业(这是对这些上载文件的一些处理)
- Web服务要求工作人员执行此工作
- Worker执行此任务并将结果上载到S3
- 用户从web服务器请求下载链接,返回
somedbrecord.result\u file.url
- 用户使用此链接下载结果
QueuedStorage
backend。我像这样启动我的文件字段
:
user_uploaded_file = models.FileField(..., storage=queued_s3storage, ...)
result_file = models.FileField(..., storage=queued_s3storage, ...)
# 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()
其中,queued_s3storage
是从后端派生的类对象。QueuedStorage
和remote
字段设置为“…backends.s3boto.s3botostrage”
现在我计划在一台机器上部署整个系统,以便在本地运行所有内容,我想用基于本地文件系统的内容替换这个“…backends.s3boto.s3botostrage”
第一个解决方法是使用FakeS3,它可以在本地“模拟”S3。工作,但这不是理想的,只是额外的不必要的开销
我让Nginx服务器运行并提供来自特定目录的静态文件。如何创建我的“远程存储”类,该类实际上在本地存储文件,但提供指向Nginx提供的文件的下载链接?(类似于
http://myip:80/filedir/file1
)。django中是否有标准的库类?媒体文件的默认存储后端是本地存储
您的settings.py
定义了以下两个环境变量:
——这是本地文件存储文件夹的绝对路径MEDIA\u ROOT
——这是Web服务器的HTTP路径(例如MEDIA\u URL
或'/MEDIA/'
'/%s/MEDIA'%HOSTNAME
# Default file storage mechanism that holds media.
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
此配置的默认存储用于未提供存储的kwarg
文件字段中。也可以这样访问它:rom django.core.files.storage import default\u storage
因此,如果您想改变存储以供本地开发和生产使用,可以执行以下操作:
user_uploaded_file = models.FileField(..., storage=queued_s3storage, ...)
result_file = models.FileField(..., storage=queued_s3storage, ...)
# 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\u URL
提供文件。只需确保nginx URL与MEDIA\u URL
中的路径匹配即可
我计划在一台机器上部署整个系统,以便在本地运行所有内容
那就停止使用QueuedStorage
,因为你刚才说你不想要遥控器
只需使用并配置nginx来提供
位置设置。MEDIA\u ROOT
谢谢!MEDIA\u URL是我一直在寻找的,您提到的主机名是嵌入在django中的?或者是我自己在settings.py中指定的变量?当然,我现在根本不需要排队存储。