Django раздельное расположение статических файлов

Я работаю с Django 3.2 и у меня есть 3 типа статических файлов (изображения, css файлы, js файлы).

Я не хотел, чтобы изображения версионировались с помощью git, поэтому я нашел способ обслуживать их с помощью aws S3 bucket, используя django-storages и boto3. Это работает отлично со следующей конфигурацией в моем файле 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'

Хотя эта конфигурация работает отлично, она вынуждает меня держать мои CSS и js файлы в AWS s3 bucket также. Я был совершенно счастлив, когда мои CSS и js файлы обслуживались django (или NGINX в production) и версионировались вместе с моим кодом без необходимости копировать их в ведро вручную.

Есть ли у вас решение для обслуживания только статических изображений с помощью AWS S3 и CSS/JS файлов с помощью NGINX ?

{% static ... %} - это просто тег шаблона , который является функцией, которая строит весь URL на основе заданного значения и STATIC_URL из settings.py. Когда Django обслуживает статические файлы в dev, он сопоставляет STATIC_URL префикс из URL в STATIC_ROOT и таким образом разрешает местоположение файла.

Для обслуживания статических файлов с помощью NGINX вам нужно только сгенерировать правильные URL в шаблонах. Сопоставление URL с файлами будет выполняться NGINX через config location -> root/alias.

Одним из возможных решений является разделение URL (префиксов URL) для изображений и скриптов путем внедрения собственного "статического" тега шаблона , генерирующего нужные вам 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. Таким образом, вы сможете сопоставлять различные типы статических файлов с различными механизмами хранения.

Вернуться на верх