【问题标题】:Can Django STATIC_ROOT point to path on another server?Django STATIC_ROOT 可以指向另一台服务器上的路径吗?
【发布时间】:2023-02-03 12:49:43
【问题描述】:
我在我的项目中使用 Django 4.0.1,在部署我的站点之前,我面临着处理我的静态文件的问题。由于我的服务器的限制,我决定改为通过 CDN 提供这些静态文件。
我已经在settings.py中配置了我的STATIC_URL选项:
STATIC_URL = 'assets/'
我知道在 Django 文档中,他们说这个 url 指的是位于 STATIC_ROOT 中的静态文件。当然,通常后者是您服务器上的绝对路径,collectstatic 命令收集静态文件并将它们放在那里,但我想知道我是否可以配置此 STATIC_ROOT 以指向不在我的服务器上的路径.
准确的说,我想知道能不能把STATIC_ROOT指向我的CDN存储。通过这种方式,我仍然可以使用 STATIC_URL 来引用我的静态资产,同时能够通过 CDN 为它们提供服务。
【问题讨论】:
标签:
python
python-3.x
django
【解决方案1】:
是的,它实际上是多年来为静态文件提供服务的推荐方式。不知道为什么 Django 没有将它添加到它的核心。
你可以使用django-storages,它支持几乎所有的云提供商。您可以将它用于 media 和/或 static。
【解决方案2】:
是的,您绝对可以将它用于任何其他服务器。例如,当我们使用 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')