gpt4 book ai didi

python - 在 S3 上存储静态文件,但在本地显示 staticfiles.json

转载 作者:太空狗 更新时间:2023-10-29 18:33:15 25 4
gpt4 key购买 nike

我有一个在 Heroku 上运行的 Django 应用程序。为了存储和提供我的静态文件,我正在使用 django-storages使用我的 S3 存储桶,以及标准的 Django ManifestFilesMixin。我也在使用 django-pipeline .

在代码中:

from django.contrib.staticfiles.storage import ManifestFilesMixin
from storages.backends.s3boto import S3BotoStorage
from pipeline.storage import PipelineMixin

class S3PipelineManifestStorage(PipelineMixin, ManifestFilesMixin, S3BotoStorage):
pass

设置有效,但是 staticfiles.json list 存储在 S3 上。我可以看到两个问题:

  1. 我的应用程序的存储实例必须从 S3 获取 staticfiles.json,而不是仅仅从本地文件系统获取。这在性能方面毫无意义。 list 文件的唯一使用者是服务器应用程序本身,因此它也可以存储在本地文件系统上而不是远程存储。

    我不确定这个问题有多重要,因为我假设(或希望)服务器应用在读取文件一次后缓存该文件。

  2. list 文件由 collectstatic 编写部署期间,因此如果服务器应用程序的先前版本的任何已经运行的实例从读取 list 文件在部署完成和新 slug 接管之前的 S3,他们可能会获取错误的静态文件 - 那些应该只为新 slug 的实例提供的文件。

    请注意,特别是在 Heroku 上,新的应用程序实例可能会动态弹出,因此即使应用程序确实缓存了 list 文件,它的第一次获取也可能是在部署新 slug 期间。

    所描述的这种情况是 Heroku 特有的,但我想其他环境也会有类似的问题。

显而易见的解决方案是将 list 文件存储在本地文件系统中。每个 slug 都有自己的 list 文件,性能将是最佳的,并且不会出现如上所述的任何部署竞争。

这可能吗?

最佳答案

前段时间我读了this article我相信这很适合你的情况。
在最后一段中存在以下内容:

Where is staticfiles.json located?

By default staticfiles.json will reside in STATIC_ROOT which is the directory where all static files are collected in.
We host all our static assets on an S3 bucket which means staticfiles.json by default would end up being synced to S3. However, we wanted it to live in the code directory so we could package it and ship it to each app server.

As a result of this, ManifestStaticFilesStorage will look for staticfiles.json in STATIC_ROOT in order to read the mappings. We had to overwrite this behaviour, so we subclassed ManifestStaticFilesStorage:

from django.contrib.staticfiles.storage import
ManifestStaticFilesStorage from django.conf import settings

class KoganManifestStaticFilesStorage(ManifestStaticFilesStorage):

def read_manifest(self):
"""
Looks up staticfiles.json in Project directory
"""
manifest_location = os.path.abspath(
os.path.join(settings.PROJECT_ROOT, self.manifest_name)
)
try:
with open(manifest_location) as manifest:
return manifest.read().decode('utf-8')
except IOError:
return None

With the above change, Django static template tag will now read the mappings from staticfiles.json that resides in project root directory.

我自己没用过,如果有帮助请告诉我!

关于python - 在 S3 上存储静态文件,但在本地显示 staticfiles.json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50387587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com