Подтверждение удаления объекта S3 из Heroku

#amazon-s3 #boto3

#amazon-s3 #boto3

Вопрос:

Я удаляю объект из моей корзины S3 из Heroku, выполнив:

 S3_BUCKET = os.environ.get('S3_BUCKET')
key = str(form.trackID.data)   '.m4a'
s3 = boto3.client('s3')
response = s3.delete_object(Bucket=S3_BUCKET, Key=key)
print(response)
  

Похоже, что файлы удаляются, но ответ, который я получаю, не такой, как я ожидал:

 {'ResponseMetadata': {'HostId': 'kxEnqrRWgfIdeqdUaGQB5ZS75MrMO hfw/pZPcUxwzLnaRYwqQ7ORyf34S/dsWnRvyVnPuBabPM=', 'HTTPStatusCode': 204, 'RetryAttempts': 0, 'HTTPHeaders': {'server': 'AmazonS3', 'date': 'Fri, 21 Oct 2016 01:54:09 GMT', 'x-amz-request-id': 'E2030C4C2CC59C65', 'x-amz-id-2': 'kxEnqrRWgfIdeqdUaGQB5ZS75MrMO hfw/pZPcUxwzLnaRYwqQ7ORyf34S/dsWnRvyVnPuBabPM='}, 'RequestId': 'E2030C4C2CC59C65'}}
  

но в документации говорится, что я должен ожидать словарь, подобный приведенному ниже:

 {
    'DeleteMarker': True|False,
    'VersionId': 'string',
    'RequestCharged': 'requester'
}
  

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.delete_object

как я могу подтвердить, что файл был удален?

Ответ №1:

Ответ, который вы получаете, правильный. Документ Boto3 неверен. Существует нерешенная проблема с исправлением документации, даже если она предназначена для delete_objects() : ответ Boto3 delete_objects не соответствует документированному ответу

Если вы хотите убедиться, что объект был удален, попробуйте:

 'Contents' in s3.list_objects(Bucket=S3_BUCKET, Prefix=key)
  

должен вернуться, True если объект существует, False если объект не существует.

Другой вариант — вызвать get_object_acl() и ожидать, что он выдаст исключение, если объект не существует.

 s3.get_object_acl(Bucket=S3_BUCKET, Key=key)

botocore.exceptions.ClientError: An error occurred (NoSuchKey) when calling the GetObjectAcl operation: The specified key does not exist.
  

Комментарии:

1. Я делаю response = s3.list_objects(Bucket=S3_BUCKET, Prefix=key) а затем if response.get('IsTruncated') == False: , чтобы убедиться, что файл не существует на s3. Затем в соответствии с if инструкцией я удаляю информацию о файле из своей базы данных. Это кажется правильным? Я не уверен, что проверка IsTruncated — это правильный способ сделать это.