Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 本地文件系统作为Django中的远程存储_Python_Django_Amazon Web Services_Nginx_Amazon S3 - Fatal编程技术网

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

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。我像这样启动我的

我使用AmazonS3作为我的Web服务的一部分。工作流程如下所示:

  • 用户将大量文件上传到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
    ——这是本地文件存储文件夹的绝对路径
  • MEDIA\u URL
    ——这是Web服务器的HTTP路径(例如
    '/MEDIA/'
    '/%s/MEDIA'%HOSTNAME
默认存储后端使用这些文件来保存媒体文件。从Django的默认/global

# 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中指定的变量?当然,我现在根本不需要排队存储。