Django集成Supabase S3 Storage遇Bucket名称类型错误求助
Django集成Supabase S3 Storage报错修复方案
问题背景
在Django项目中配置Supabase S3兼容存储后,执行collectstatic命令时出现Bucket名称类型错误,同时伴随static目录不存在的警告。
配置代码
if USE_S3: # aws settings AWS_ACCESS_KEY_ID = os.getenv("SUPA_ACCESS_KEY_ID") AWS_SECRET_ACCESS_KEY = os.getenv("SUPA_SECRET_KEY") AWS_STORAGE_BUCKET_NAME = "images" AWS_S3_REGION_NAME = os.getenv("SUPA_S3_REGION_NAME") AWS_ENDPOINT_URL = os.getenv("SUPA_S3_DOMAIN") # s3 static settings STATIC_LOCATION = "static" STATICFILES_STORAGE = "storages.backends.s3boto.S3BotoStorage" # s3 public media settings DEFAULT_FILE_STORAGE = "storages.backends.s3boto.S3BotoStorage" else: STATIC_URL = "/static/" STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles_build", "static") MEDIA_URL = "/media/" MEDIA_ROOT = os.path.join(BASE_DIR, "media/") STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
报错信息
WARNINGS: ?: (staticfiles.W004) The directory '/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/static' in the STATICFILES_DIRS setting does not exist. Traceback (most recent call last): File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/manage.py", line 22, in <module> main() File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/manage.py", line 18, in main execute_from_command_line(sys.argv) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line utility.execute() File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 436, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/django/core/management/base.py", line 412, in run_from_argv self.execute(*args, **cmd_options) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/django/core/management/base.py", line 458, in execute output = self.handle(*args, **options) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 209, in handle collected = self.collect() File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 135, in collect handler(path, prefixed_path, storage) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 368, in copy_file if not self.delete_file(path, prefixed_path, source_storage): File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 278, in delete_file if self.storage.exists(prefixed_path): File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/storages/backends/s3.py", line 514, in exists self.connection.meta.client.head_object(Bucket=self.bucket_name, Key=name) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/botocore/client.py", line 565, in _api_call return self._make_api_call(operation_name, kwargs) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/botocore/client.py", line 958, in _make_api_call api_params = self._emit_api_params( File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/botocore/client.py", line 1084, in _emit_api_params self.meta.events.emit( File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/botocore/hooks.py", line 412, in emit return self._emitter.emit(aliased_event_name, **kwargs) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/botocore/hooks.py", line 256, in emit return self._emit(event_name, kwargs) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/botocore/hooks.py", line 239, in _emit response = handler(**kwargs) File "/Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/.venv/lib/python3.9/site-packages/botocore/handlers.py", line 282, in validate_bucket_name if not VALID_BUCKET.search(bucket) and not VALID_S3_ARN.search(bucket): TypeError: expected string or bytes-like object
修复步骤
1. 替换过时的存储后端
原配置使用的s3boto.S3BotoStorage基于boto2,已停止维护,与新版botocore存在兼容性问题。将存储后端替换为基于boto3的版本:
STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
2. 补充Supabase S3必需配置
Supabase的S3兼容存储需要额外配置虚拟主机寻址方式,同时确保所有环境变量正确加载:
if USE_S3: # aws settings AWS_ACCESS_KEY_ID = os.getenv("SUPA_ACCESS_KEY_ID", "") AWS_SECRET_ACCESS_KEY = os.getenv("SUPA_SECRET_KEY", "") AWS_STORAGE_BUCKET_NAME = "images" AWS_S3_REGION_NAME = os.getenv("SUPA_S3_REGION_NAME", "us-east-1") AWS_ENDPOINT_URL = os.getenv("SUPA_S3_DOMAIN", "") # Supabase S3必需配置 AWS_S3_ADDRESSING_STYLE = "virtual" # s3 static settings STATIC_LOCATION = "static" STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" # s3 public media settings DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
- 注意:
AWS_ENDPOINT_URL需设置为Supabase存储的正确地址,格式为https://<你的项目ID>.supabase.co/storage/v1/s3 - 所有环境变量需确保已正确设置(可通过
print(os.getenv("变量名"))在Django shell中验证)
3. 修复static目录警告
执行以下命令创建缺失的static目录:
mkdir -p /Users/admin/Desktop/code/Zions_AutoERP/Zions_AutoERP/static
若不需要该目录,可注释掉STATICFILES_DIRS中对应的路径。
4. 验证配置有效性
启动Django shell检查配置值:
python manage.py shell
执行以下代码确认所有配置均为非空字符串:
from django.conf import settings print("Bucket Name:", settings.AWS_STORAGE_BUCKET_NAME) print("Access Key:", settings.AWS_ACCESS_KEY_ID) print("Endpoint URL:", settings.AWS_ENDPOINT_URL)
5. 重新执行collectstatic
配置完成后,重新执行命令:
python manage.py collectstatic
内容的提问来源于stack exchange,提问作者Think Ramen
相关产品推荐
相关产品推荐

