使用 Python 删除和还原 Blob

本文介绍如何使用适用于 Python 的 Azure 存储客户端库删除 blob。 如果已启用 Blob 软删除,则可以在保持期内还原已删除的 Blob。

要了解如何使用异步 API 删除 blob,请参阅异步删除 blob

先决条件

  • 本文假设已经设置了项目来使用适用于 Python 的 Azure Blob 存储客户端库。 若要了解如何设置项目(包括安装包、添加 import 语句和创建授权客户端对象),请参阅开始使用 Azure Blob 存储和 Python
  • 要通过代码使用异步 API,请参阅异步编程部分中的要求。
  • 授权机制必须具有删除 blob 或还原软删除 blob 的权限。 若要了解详细信息,请参阅以下 REST API 操作的授权指南:

删除 Blob

若要删除 Blob,请调用以下方法:

下面的示例删除 Blob:

def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob()

如果 Blob 具有任何关联的快照,则必须删除其所有快照才能删除该 Blob。 以下示例删除一个 Blob 及其快照:

def delete_blob_snapshots(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob(delete_snapshots="include")

若要仅删除快照,而不删除 Blob 本身,可以传递参数 delete_snapshots="only"

还原已删除的 Blob

Blob 软删除会在系统中将已删除的数据保留指定的一段时间,可以在意外删除或覆盖单个 Blob 及其版本、快照和元数据时提供保护。 在保留期内,可以将 Blob 还原到它在删除时的状态。 在指定的保留期已过后,Blob 将永久被删除。 有关 Blob 软删除的详细信息,请参阅 Blob 的软删除

可以使用 Azure 存储客户端库来还原软删除的 Blob 或快照。

还原软删除的 Blob 的方式取决于存储帐户是否启用了 Blob 版本控制。 有关 Blob 版本控制的详细信息,请参阅 Blob 版本控制。 请根据你的情况,查看以下部分之一:

禁用版本控制时还原软删除的对象

在禁用了版本控制的情况下,若要还原删除的 Blob,请调用以下任一方法:

此方法还原软删除的 Blob 以及任何关联的软删除快照的内容和元数据。 对未删除的 Blob 调用此方法不会起作用。

def restore_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.undelete_blob()

启用版本控制时还原软删除的对象

如果将存储帐户配置为启用 blob 版本控制,则删除 blob 会导致 blob 的当前版本成为以前的版本。 若要在启用了版本控制的情况下还原软删除的 Blob,请将前一个版本复制到基础 Blob。 可使用以下方法:

下面的代码示例获取已删除 Blob 的最新版本,并通过将其复制到基本 Blob 来还原最新版本:

def restore_blob_version(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    container_client = blob_service_client.get_container_client(container=container_name)

    # Get a reference to the soft-deleted base blob and list all the blob versions
    blob_client = container_client.get_blob_client(blob=blob_name)
    blob_list = container_client.list_blobs(name_starts_with=blob_name, include=['deleted','versions'])
    blob_versions = []
    for blob in blob_list:
        blob_versions.append(blob.version_id)
    
    # Get the latest version of the soft-deleted blob
    blob_versions.sort(reverse=True)
    latest_version = blob_versions[0]

    # Build the blob URI and add the version ID as a query string
    versioned_blob_url = f"{blob_client.url}?versionId={latest_version}"

    # Restore the latest version by copying it to the base blob
    blob_client.start_copy_from_url(versioned_blob_url)

异步删除 blob

适用于 Python 的 Azure Blob 存储客户端库支持异步删除 blob。 要详细了解项目设置要求,请参阅异步编程

按照以下步骤使用异步 API 删除 blob:

  1. 添加以下 import 语句:
import asyncio

from azure.identity.aio import DefaultAzureCredential
from azure.storage.blob.aio import BlobServiceClient
  1. 添加代码以使用asyncio.run运行程序。 此函数运行传递的协同例程(我们示例中的main()),并管理asyncio事件循环。 使用 async/await 语法声明协同例程。 在此示例中,main() 协同例程先使用 async with 创建顶级 BlobServiceClient,然后调用删除 blob 的方法。 请注意,只有顶级客户端需要使用async with,因为基于它创建的其他客户端会共享同一连接池。
async def main():
    sample = BlobSamples()

    # TODO: Replace <storage-account-name> with your actual storage account name
    account_url = "https://<storage-account-name>.blob.core.chinacloudapi.cn"
    credential = DefaultAzureCredential()

    async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
        await sample.delete_blob(blob_service_client, "sample-container", "sample-blob.txt")

if __name__ == '__main__':
    asyncio.run(main())
  1. 添加用于删除 blob 的代码。 该代码与同步示例相同,除了该方法使用async关键字声明,await关键字在调用delete_blob方法时使用。
async def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    await blob_client.delete_blob()

有了此基本设置,即可使用 async/await 语法将本文中的其他示例实现为协同例程。

资源

若要详细了解如何使用适用于 Python 的 Azure Blob 存储客户端库来删除 blob 以及还原已删除的 blob,请参阅以下资源。

REST API 操作

Azure SDK for Python 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 Python 范例与 REST API 操作进行交互。 用于删除 Blob 和还原已删除 Blob 的客户端库方法使用以下 REST API 操作:

代码示例

客户端库资源

请参阅