此问题适用于 AWS S3 存储桶和 DigitalOcean Spaces 存储桶。
复制错误:
import boto3
KEY = '********************',
SECRET_KEY = '*******************************************'
# Initialize a session using DigitalOcean Spaces.
session = boto3.session.Session()
client = session.client('s3', region_name='sgp1',
endpoint_url='https://sgp1.digitaloceanspaces.com',
aws_access_key_id=KEY,
aws_secret_access_key=SECRET_KEY)
抛出错误:
~/.pyenv/versions/3.8.0/lib/python3.8/site-packages/botocore/auth.py in scope(self, request)
322 scope.append(self._service_name)
323 scope.append('aws4_request')
--> 324 return '/'.join(scope)
325
326 def credential_scope(self, request):
TypeError: sequence item 0: expected str instance, tuple found
看起来 API 有问题,但如果我们仔细观察,
>>>print(type(SECRET_KEY))
str
>>> print(type(KEY))
tuple
正如michael-sqlbot 所评论的,在其中一个身份验证键中有一个tuple 类型。
请注意上面代码中的逗号:
import boto3
KEY = '********************',
只需去掉逗号即可将其更改为字符串类型:
import boto3
KEY = '********************',
SECRET_KEY = '*******************************************'
# Initialize a session using DigitalOcean Spaces.
session = boto3.session.Session()
client = session.client('s3', region_name='sgp1',
endpoint_url='https://sgp1.digitaloceanspaces.com',
aws_access_key_id=KEY,
aws_secret_access_key=SECRET_KEY)
[出]:
{'ResponseMetadata': {'RequestId': '*************',
'HostId': '',
'HTTPStatusCode': 200,
'HTTPHeaders': {'transfer-encoding': 'chunked',
'x-amz-request-id': '*************',
'content-type': 'application/xml',
'date': 'Mon, 15 Jun 2020 01:14:42 GMT',
'strict-transport-security': 'max-age=15552000; includeSubDomains; preload'},
'RetryAttempts': 0},
'Buckets': [{'Name': '*****',
'CreationDate': datetime.datetime(2019, 11, 20, 8, 28, 36, 548000, tzinfo=tzutc())}],
'Owner': {'DisplayName': '*******', 'ID': '********'}}