Может ли Django STATIC_ROOT указывать на путь на другом сервере?

Я использую Django 4.0.1 в своем проекте, и прямо перед развертыванием сайта я столкнулся с проблемой обработки статических файлов. Из-за ограничений моего сервера я решил вместо этого обслуживать эти статические файлы через CDN.

Я уже настроил свою опцию STATIC_URL в settings.py:

STATIC_URL = 'assets/'

Я знаю, что в документации Django говорится, что этот url ссылается на статические файлы, расположенные в STATIC_ROOT. Конечно, обычно последний является абсолютным путем на вашем сервере, где команда collectstatic собирает статические файлы и помещает их туда, но мне интересно, могу ли я настроить этот STATIC_ROOT на путь, которого нет на моем сервере.

Точнее говоря, я хочу знать, могу ли я указать STATIC_ROOT на мое хранилище CDN. Таким образом, я смогу по-прежнему использовать STATIC_URL для ссылки на мои статические активы, в то же время имея возможность обслуживать их через CDN.

Да, это действительно рекомендуемый способ обслуживания статических файлов в течение многих лет. Не уверен, почему Django не добавил его в свое ядро.

Вы можете использовать django-storages, он поддерживает почти всех облачных провайдеров. Вы можете использовать его для media и/или static.

Да, безусловно, вы можете использовать его для любого другого сервера. Например, если мы используем AWS S3 в качестве сервера для обслуживания статических файлов, это должно выглядеть следующим образом :

USE_S3 = os.getenv('USE_S3') == 'TRUE'

if USE_S3:
    # aws settings
    AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
    AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
    AWS_DEFAULT_ACL = 'public-read'
    AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
    AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'}
    # s3 static settings
    AWS_LOCATION = 'static'
    STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{AWS_LOCATION}/'
    STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
else:
    STATIC_URL = '/staticfiles/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Вернуться на верх