如何使 django 环境中的 boto 可以访问 AWS 凭证?

How to make AWS credentials accessible to boto in django environment?

我无法通过 django-s3-storages 中间件在我的 django 环境中创建 S3 连接(我从 S3 收到 403 响应)。

Boto 似乎无法获取环境设置,我怀疑这就是原因(追溯没有太大帮助)。作为 manage.py shell 中的诊断:

import boto
boto.connect_s3()
>>> boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] Check your credentials

from django.conf import settings
boto.connect_s3(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
>>> S3Connection:s3.amazonaws.com

The docs(和其他帖子)表明这些设置应该有效:

MEDIAFILES_LOCATION = 'media'
AWS_S3_CUSTOM_DOMAIN = 'my-bucket.s3-website-eu-west-1.amazonaws.com'
AWS_S3_HOST = 's3-website-eu-west-1.amazonaws.com'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'django_s3_storage.storage.StaticS3Storage'

#S3 settings from https://github.com/etianen/django-s3-storage
AWS_ACCESS_KEY_ID = "xxx"
AWS_SECRET_ACCESS_KEY = "yyy"
AWS_S3_BUCKET_NAME = "my-bucket"
AWS_S3_CALLING_FORMAT = "boto.s3.connection.OrdinaryCallingFormat"

# Make user uploaded files public
AWS_S3_BUCKET_AUTH = False
AWS_S3_MAX_AGE_SECONDS = 60*60*24*365 # 1 year
AWS_S3_GZIP = True

为什么 boto 无法连接?

django 存储中间件使用它自己的 S3Storage class。 class 知道 django 的 settings.py 并且将使用 settings.AWS_ACCESS_KEY_IDsettings.AWS_SECRET_ACCESS_KEY 如果它们被配置。

boto3 本身不知道 django 设置文件,因此它不使用您在该文件中配置的任何内容。这就是为什么您在尝试建立 S3 连接时必须指定 boto3 的密钥和机密。