Может ли 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')