Django迁移后django-storages将桶名作为文件夹存入问题排查
问题分析与解决方案
这是配置冲突导致的,并非django-storages的Bug。问题出在你的endpoint_url与bucket_name配置的逻辑冲突上,新版本django-storages的路径解析逻辑和旧版本(搭配Django3.2时)有差异,引发了这个问题。
核心原因
DigitalOcean Spaces的端点有两种标准格式:
- 子域名模式:
https://<bucket-name>.<region>.digitaloceanspaces.com/(桶名作为子域名直接包含在端点中) - 路径模式:
https://<region>.digitaloceanspaces.com/(桶名通过后续路径指定)
你的配置中,endpoint_url已经包含了桶名(mySubdomain应该就是你的myBucket),同时又显式设置了bucket_name: 'myBucket'。新版本的django-storages会把这个显式设置的bucket_name当成对象的路径前缀,最终导致文件被存入/myBucket/static/路径下,而非预期的桶内static/目录。
修正后的配置
根据你使用的端点模式二选一:
模式一:子域名模式(推荐)
移除bucket_name配置,因为端点已经包含桶名:
STORAGES = { "default": { "BACKEND": "django.core.files.storage.FileSystemStorage", }, "staticfiles": { "BACKEND": "storages.backends.s3boto3.S3Boto3Storage", "OPTIONS": { "secret_key": "mySecretKey", "access_key": "myAccessKey", "endpoint_url": 'https://myBucket.sfo2.digitaloceanspaces.com/', "object_parameters": {'CacheControl': 'max-age=86400'}, "location": 'static', "default_acl": 'public-read', }, }, } STATIC_URL = "https://myBucket.sfo2.digitaloceanspaces.com/static/"
模式二:路径模式
保留bucket_name,但修改端点为不带桶名的区域地址,同时调整STATIC_URL:
STORAGES = { "default": { "BACKEND": "django.core.files.storage.FileSystemStorage", }, "staticfiles": { "BACKEND": "storages.backends.s3boto3.S3Boto3Storage", "OPTIONS": { "secret_key": "mySecretKey", "access_key": "myAccessKey", "bucket_name": 'myBucket', "endpoint_url": 'https://sfo2.digitaloceanspaces.com/', "object_parameters": {'CacheControl': 'max-age=86400'}, "location": 'static', "default_acl": 'public-read', }, }, } STATIC_URL = "https://sfo2.digitaloceanspaces.com/myBucket/static/"
验证
修改配置后,执行python manage.py collectstatic --clear(--clear用于清空旧的错误路径文件),即可看到文件被正确存入桶的static/目录下。
内容的提问来源于stack exchange,提问作者user1389840
相关产品推荐
相关产品推荐

