部署Django应用执行collectstatic报错:找不到S3StaticStorage后端
部署Django应用执行collectstatic时S3连接失败排查
问题现象
执行collectstatic命令时触发如下错误:
Traceback (most recent call last): File "/home/ubuntu/campmanager/manage.py", line 22, in <module> main() File "/home/ubuntu/campmanager/manage.py", line 18, in main execute_from_command_line(sys.argv) File "/home/ubuntu/.local/lib/python3.10/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line utility.execute() File "/home/ubuntu/.local/lib/python3.10/site-packages/django/core/management/__init__.py", line 436, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/ubuntu/.local/lib/python3.10/site-packages/django/core/management/base.py", line 416, in run_from_argv self.execute(*args, **cmd_options) File "/home/ubuntu/.local/lib/python3.10/site-packages/django/core/management/base.py", line 460, in execute output = self.handle(*args, **options) File "/home/ubuntu/.local/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 184, in handle if self.is_local_storage() and self.storage.location: File "/home/ubuntu/.local/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 245, in is_local_storage return isinstance(self.storage, FileSystemStorage) File "/home/ubuntu/.local/lib/python3.10/site-packages/django/utils/functional.py", line 280, in __getattribute__ value = super().__getattribute__(name) File "/home/ubuntu/.local/lib/python3.10/site-packages/django/utils/functional.py", line 251, in inner self._setup() File "/home/ubuntu/.local/lib/python3.10/site-packages/django/contrib/staticfiles/storage.py", line 542, in _setup self._wrapped = storages[STATICFILES_STORAGE_ALIAS] File "/home/ubuntu/.local/lib/python3.10/site-packages/django/core/files/storage/handler.py", line 34, in __getitem__ storage = self.create_storage(params) File "/home/ubuntu/.local/lib/python3.10/site-packages/django/core/files/storage/handler.py", line 45, in create_storage raise InvalidStorageError(f"Could not find backend {backend!r}: {e}") from e django.core.files.storage.handler.InvalidStorageError: Could not find backend 'storages.backends.s3boto3.S3StaticStorage': Module "storages.backends.s3boto3" does not define a "S3StaticStorage" attribute/class
当前settings.py相关配置
STATIC_ROOT = os.path.join(CORE_DIR, 'staticfiles') STATIC_URL = 'static/' AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY') AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME') AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME AWS_DEFAULT_ACL = 'public-read' DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' AWS_MEDIA_LOCATION = 'media-dev' MEDIA_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_MEDIA_LOCATION) S3_URL = 'https://%s/' % (AWS_S3_CUSTOM_DOMAIN) STORAGES = { "default": { "BACKEND" : "storages.backends.s3boto3.S3StaticStorage", }, "staticfiles": { "BACKEND" : "storages.backends.s3boto3.S3StaticStorage", }, }
解决方案
1. 修正存储类名称
报错核心是S3StaticStorage不存在——django-storages的s3boto3后端没有这个类,静态文件和媒体文件统一使用S3Boto3Storage。如需区分存储路径,通过OPTIONS配置location参数即可。
2. 调整后的完整配置
STATIC_ROOT = os.path.join(CORE_DIR, 'staticfiles') AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY') AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME') AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME AWS_DEFAULT_ACL = 'public-read' # 媒体文件存储配置 DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' AWS_MEDIA_LOCATION = 'media-dev' MEDIA_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_MEDIA_LOCATION) # 静态文件存储配置 AWS_STATIC_LOCATION = 'static-dev' STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION) STORAGES = { "default": { "BACKEND": "storages.backends.s3boto3.S3Boto3Storage", }, "staticfiles": { "BACKEND": "storages.backends.s3boto3.S3Boto3Storage", "OPTIONS": { "location": AWS_STATIC_LOCATION, }, }, }
3. 确保依赖版本正确
执行以下命令升级django-storages并安装完整的boto3依赖:
pip install --upgrade django-storages[boto3]
完成以上调整后,重新执行collectstatic命令即可正常同步静态文件到S3桶。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

