Django静态文件的单独位置

Django separate location of static files

我正在使用 Django 3.2,我有 3 种类型的静态文件(图像、css 文件、js 文件)。

我不希望使用 git 对图像进行版本控制,因此我找到了一种方法,使用 django-storagesboto3 让它们由 aws S3 存储桶提供服务。它与我的 settings.py 文件中的以下配置完美配合:

AWS_ACCESS_KEY_ID = "my-key-id"
AWS_SECRET_ACCESS_KEY = "my-secret-key"
AWS_STORAGE_BUCKET_NAME = "my-bucket-name"
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
#DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_S3_ADDRESSING_STYLE = "virtual"
AWS_S3_REGION_NAME = 'my-region'
AWS_S3_SIGNATURE_VERSION = 's3v4'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

虽然这个配置工作得很好,但它迫使我在 AWS s3 存储桶中也有我的 CSS 和 js 文件。我对我的 CSS 和 js 文件由 django(或生产中的 NGINX)提供服务并使用我的代码进行版本控制而无需手动将它们复制到存储桶中感到非常满意。

您是否有解决方案来仅通过 AWS S3 提供静态图像并通过 NGINX 提供 CSS/JS 文件?

{% static ... %} 只是一个 template tag,它是一个根据给定值和 [=31 中的 STATIC_URL 构建整个 URL 的函数=]。当 Django 在 dev 中提供静态文件时,它将 STATIC_URL 前缀从 URL 映射到 STATIC_ROOT,从而解析文件位置。

要使用 NGINX 提供静态文件,您只需在模板中生成正确的 URLs。将 URLs 映射到文件将由 NGINX 通过配置 location -> root/alias.

完成

一种可能的解决方案是通过实现您自己的“静态”template tag 生成 URLs 来为图像和脚本划分 URLs(URL 前缀)需要。例如

@register.simple_tag(name="static_script")
def static_non_image_files(path):
    return urllib.parse.urljoin(settings.STATIC_SCRIPTS_URL, path)

并使用此模板标签代替 static 用于 {% static_script "/style/main.css" %} 等脚本。同时对 S3 上的图像使用 static。因此,您将能够将不同类型的静态文件映射到不同的存储引擎。