如何在Django中正确配置Backblaze B2作为媒体文件存储?
解决Django媒体文件无法上传至Backblaze B2的问题
以下是针对你的配置问题的修正方案,按步骤调整:
1. 修正依赖包配置
你的INSTALLED_APPS里添加的是boto,但使用S3Boto3Storage需要依赖boto3,替换成:
INSTALLED_APPS = [ # ... 其他应用 'storages', 'boto3', ]
同时确保已安装对应依赖:
pip install boto3 django-storages
2. 完善S3兼容配置项
Backblaze B2的S3兼容模式需要补充关键配置,修正你的STORAGES及相关参数:
STORAGES = { "default": { "BACKEND": "storages.backends.s3boto3.S3Boto3Storage", "OPTIONS": { "region_name": AWS_S3_REGION_NAME, "endpoint_url": AWS_S3_ENDPOINT_URL, "aws_access_key_id": AWS_ACCESS_KEY_ID, "aws_secret_access_key": AWS_SECRET_ACCESS_KEY, "bucket_name": AWS_STORAGE_BUCKET_NAME, }, }, "staticfiles": { "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage", }, } # Backblaze B2 核心配置 AWS_ACCESS_KEY_ID = "<my_backblaze_application_keyID>" AWS_SECRET_ACCESS_KEY = "<my_backblaze_applicationKey>" AWS_STORAGE_BUCKET_NAME = "<my_public_bucket_name>" AWS_S3_REGION_NAME = "<region_set_by_backblaze>" # 格式示例:'us-west-001' AWS_S3_ENDPOINT_URL = f"https://s3.{AWS_S3_REGION_NAME}.backblazeb2.com" AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.backblazeb2.com" # 公开桶适配配置 AWS_S3_FILE_OVERWRITE = False AWS_QUERYSTRING_AUTH = False # 避免生成带签名的URL AWS_S3_OBJECT_PARAMS = { 'ACL': 'public-read', # 匹配公开桶的权限设置 } # 修正MEDIA_URL指向Backblaze域名 MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
3. 验证权限与桶设置
- 确认Backblaze应用密钥拥有写入目标桶的权限(创建密钥时需勾选"Write Files"和"Delete Files")
- 确认桶的区域与
AWS_S3_REGION_NAME完全一致(可在Backblaze控制台的桶详情页查看) - 若为私有桶,需将
AWS_S3_OBJECT_PARAMS的ACL改为private,并额外处理媒体文件的访问逻辑
4. 测试上传
启动Django服务后尝试上传媒体文件,查看Backblaze控制台的桶内是否出现media/前缀的文件。若仍失败,可查看Django日志排查认证或权限类报错。
内容的提问来源于stack exchange,提问作者Samiddha
相关产品推荐
相关产品推荐

