当我尝试将 Django 应用程序配置为使用 DigitalOcean Spaces 处理静态文件和媒体文件时,我遇到了问题。这是我的
settings.py
文件的相关部分:
import boto3
from botocore.exceptions import NoCredentialsError, PartialCredentialsError
from botocore.client import Config
from os import getenv
AWS_ACCESS_KEY_ID = getenv('SPACES_KEY')
AWS_SECRET_ACCESS_KEY = getenv('SPACES_SECRET')
AWS_STORAGE_BUCKET_NAME = getenv('BUCKET_NAME')
AWS_S3_REGION_NAME = "region"
AWS_S3_ENDPOINT_URL = f"https://{AWS_S3_REGION_NAME}.digitaloceanspaces.com"
AWS_S3_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_DEFAULT_ACL = 'public-read'
AWS_S3_SIGNATURE_VERSION = 's3v4'
STATIC_URL = f"{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}/static/"
MEDIA_URL = f"{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}/media/"
STATICFILES_STORAGE = 'name.custom_storages.StaticStorage'
DEFAULT_FILE_STORAGE = 'name.custom_storages.MediaStorage'
# Ensure the credentials are explicitly set for boto3
session = boto3.session.Session()
s3_client = session.client(
's3',
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,
config=Config(signature_version='s3v4')
)
# Test connection to S3
def test_s3_connection():
try:
print("Connecting to S3...")
response = s3_client.list_objects_v2(Bucket=AWS_STORAGE_BUCKET_NAME)
print("Connection successful. Contents:")
for obj in response.get('Contents', []):
print(obj['Key'])
except NoCredentialsError:
print("Error: No credentials found.")
except PartialCredentialsError:
print("Error: Incomplete credentials.")
except Exception as e:
print(f"Error: {e}")
test_s3_connection()
当我使用
python3 manage.py runserver
运行服务器时,出现以下错误:
Traceback (most recent call last):
...
File "/Users/User/.aws/credentials"
botocore.exceptions.ConfigParseError: Unable to parse config file: /Users/User/.aws/credentials
我不希望 boto3 使用 ~/.aws 中的凭证/credentials 文件,因为我没有使用 AWS,而是使用 DigitalOcean Spaces。
任何有关如何解决此问题的帮助或建议将不胜感激。提前致谢!
已验证 AWS 凭证文件:
-
检查语法错误:我确保凭证文件中没有语法错误或格式问题。
-
环境变量:我确认环境变量 ( SPACES_KEY、SPACES_SECRET、BUCKET_NAME)在我的环境中设置正确。
-
更新了 boto3 和 botocore:我确保我的虚拟环境中安装了最新版本的 boto3 和 botocore。
-
调试日志:添加了打印语句和日志记录验证环境变量是否已正确加载并传递给 boto3。
-
我希望 Django 应用程序仅使用提供的环境变量来初始化 boto3 会话,而不引用 AWS 凭证文件。但是,我不断遇到与凭据文件相关的 ConfigParseError,并且无法继续操作。
任何有关如何解决此问题的见解或建议将不胜感激。
此错误表示,即使你正在提供凭证,boto3 仍然尝试从 AWS 凭证文件中加载凭证。要解决此问题,你可以通过以下方法之一明确指示 boto3 使用你提供的环境变量:
1. 使用
boto3.client
直接创建客户端:
你无需创建一个
boto3.session.Session
对象,而是可以直接创建
s3
客户端,并在那里传递你的凭证:
import boto3
from botocore.client import Config
# ... your other settings ...
s3_client = boto3.client(
's3',
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,
config=Config(signature_version='s3v4')
)
# ... your test_s3_connection function ...
此方法绕过了创建会话,从而防止 boto3 搜索凭证文件。
2. 使用
boto3.setup_default_session
:
此方法让你为 boto3 设置默认会话,并在那里提供你的凭证:
import boto3
from botocore.client import Config
# ... your other settings ...
boto3.setup_default_session(
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
region_name=AWS_S3_REGION_NAME
)
s3_client = boto3.client('s3', endpoint_url=AWS_S3_ENDPOINT_URL, config=Config(signature_version='s3v4'))
# ... your test_s3_connection function ...
这将设置一个默认会话,boto3 将使用该会话来创建所有后续的客户端,包括你的
s3_client
。
在这两种方法中,你都明确地提供了 boto3 所需的凭证,从而阻止它搜索凭证文件并解决
ConfigParseError
。