You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:24:56