使用 Python 删除和还原 Blob

本文介绍如何使用适用于 Python 的 Azure 存储客户端库删除 Blob,以及如何在保留期内还原软删除的 Blob。

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

先决条件

设置你的环境

如果没有现有项目,请查看本部分,其中介绍如何设置项目来使用适用于 Python 的 Azure Blob 存储客户端库。 有关更多详细信息,请参阅 Azure Blob 存储和 Python 入门

要使用本文中的代码示例,请按照以下步骤设置项目。

安装包

使用 pip install 安装以下包:

pip install azure-storage-blob azure-identity

添加 import 语句

添加以下 import 语句:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

授权

授权机制必须具有删除 Blob 或还原软删除 Blob 所需的权限。 若要使用 Microsoft Entra ID 进行授权(建议),需有 Azure RBAC 内置角色“存储 Blob 数据参与者”或更高级别的角色。 要了解详细信息,请参阅删除 Blob (REST API)取消删除 Blob (REST API) 的授权指导。

创建客户端对象

若要将应用连接到 Blob 存储,请创建 BlobServiceClient 的实例。 以下示例演示如何使用 DefaultAzureCredential 创建客户端对象进行授权:

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

# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)

还可以为特定容器Blob 创建客户端对象,不管是直接创建还是通过 BlobServiceClient 对象创建。 要详细了解如何创建和管理客户端对象,请参阅 创建和管理与数据资源交互的客户端对象

删除 Blob

注意

为存储帐户启用 Blob 软删除后,无法使用客户端库方法执行永久删除。 如果使用本文中所述的方法,软删除的 Blob、Blob 版本或快照在保留期结束之前会一直保持可用,保留期结束后将被永久删除。 若要详细了解基础 REST API 操作,请参阅删除 Blob (REST API)

若要删除 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 操作:

客户端库资源

请参阅

  • 本文是 Python 版 Blob 存储开发人员指南的一部分。 若要了解详细信息,请参阅生成 Python 应用中的开发人员指南文章的完整列表。