Django 5.1.1中collectstatic与S3存储配置冲突问题解决
升级Django到5.1.1后S3静态文件托管问题及解决办法
问题详情
- 运行环境:Python 3.12.3、Django 5.1.1
- 此前通过
python manage.py collectstatic可正常将静态文件推送到S3存储桶,升级Django版本后出现异常
未设置STATIC_ROOT时的报错
django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
设置STATIC_ROOT后的异常
静态文件会被收集到本地目录而非S3,提示如下:
You have requested to collect static files at the destination location as specified in your settings: /-local storage-/static
当前settings.py配置
# STATIC_ROOT = os.path.join(BASE_DIR, "static") STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, "static") ] YOUR_S3_BUCKET = "static-bucket" STATICFILES_STORAGE = "django_s3_storage.storage.StaticS3Storage" AWS_S3_BUCKET_NAME_STATIC = YOUR_S3_BUCKET # 直接从S3存储桶提供静态文件 AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % YOUR_S3_BUCKET STATIC_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN
补充:已配置S3访问凭证,未设置STORAGES参数,使用django_s3_storage和storages第三方包。
解决方案
问题根源:STATICFILES_STORAGE参数自Django 4.2起被标记为弃用,Django 5.1版本中已完全移除,需改用新的STORAGES配置项。
修改后的settings.py配置如下:
# 直接从S3存储桶提供静态文件 AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % YOUR_S3_BUCKET STATIC_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN STORAGES = { 'default': { 'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage', }, 'staticfiles': { 'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage', 'OPTIONS': { 'bucket_name': AWS_S3_BUCKET_NAME_STATIC, }, }, }
内容的提问来源于stack exchange,提问作者Eloque
相关产品推荐
相关产品推荐

