Ошибка инициализации сессии boto3 в Django-приложении с использованием DigitalOcean Spaces
У меня возникла проблема с моим 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, связанной с файлом учетных данных, и не могу продолжить работу.
Любые соображения или предложения о том, как решить эту проблему, будут очень признательны.
Похоже, что у вас есть файл по адресу ~/.aws/credentials
, который имеет какое-то недопустимое содержимое.
В любом случае, ваша проблема в том, что вы вызываете boto3.session.Session()
без аргументов, поэтому он пытается использовать поведение по умолчанию для поиска учетных данных. Вы ждете, пока не создадите S3-клиент, чтобы "отменить" стандартные настройки учетных данных boto3 с вашими собственными учетными данными для S3-клиента. Вместо этого вы должны просто передать эти учетные данные в вызов Session.