快速入门:适用于 Python 的 Azure Blob 存储客户端库
开始使用适用于 Python 的 Azure Blob 存储客户端库来管理 Blob 和容器。
在本文中,你将按照步骤安装软件包,并试用基本任务的示例代码。
API 参考文档 | 库源代码 | 包 (PyPi) | 示例
先决条件
- 具有有效订阅的 Azure 帐户 - 创建试用帐户。
- Azure 存储帐户 - 创建存储帐户
- Python 3.8+
设置
本部分逐步指导如何准备一个项目,使其与适用于 Python 的 Azure Blob 存储客户端库配合使用。
创建项目
创建名为 blob-quickstart 的 Python 应用程序。
在控制台窗口(如 PowerShell 或 Bash)中,为项目创建一个新目录:
mkdir blob-quickstart
切换到新创建的 blob-quickstart 目录:
cd blob-quickstart
安装包
从项目目录中,使用 pip install
命令安装 Azure Blob 存储和 Azure 标识客户端库的包。 与 Azure 服务的无密码连接需要 azure-identity 包。
pip install azure-storage-blob azure-identity
设置应用框架
从项目目录中,按照以下步骤创建应用的基本结构:
- 在代码编辑器中打开新文本文件。
- 添加
import
语句,创建程序的结构,并包括基本的异常处理,如下所示。 - 在“blob-quickstart”目录中,将新文件保存为“blob_quickstart.py”。
import os, uuid
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient
try:
print("Azure Blob Storage Python quickstart sample")
# Quickstart code goes here
except Exception as ex:
print('Exception:')
print(ex)
对象模型
Azure Blob 存储最适合存储巨量的非结构化数据。 非结构化数据是不遵循特定数据模型或定义的数据(如文本或二进制数据)。 Blob 存储提供了三种类型的资源:
- 存储帐户
- 存储帐户中的容器
- 容器中的 blob
以下图示显示了这些资源之间的关系:
使用以下 Python 类与这些资源进行交互:
- BlobServiceClient:
BlobServiceClient
类可用于操纵 Azure 存储资源和 blob 容器。 - ContainerClient:
ContainerClient
类可用于操纵 Azure 存储容器及其 blob。 - BlobClient:
BlobClient
类可用于操纵 Azure 存储 blob。
代码示例
这些示例代码片段演示了如何使用适用于 Python 的 Azure Blob 存储客户端库执行以下任务:
向 Azure 进行身份验证并授权访问 Blob 数据
对 Azure Blob 存储的应用程序请求必须获得授权。 要在代码中实现与 Azure 服务(包括 Blob 存储)的无密码连接,推荐使用 azure-identity 客户端库提供的 DefaultAzureCredential
类。
你还可以使用帐户访问密钥授权对 Azure Blob 存储的请求。 但是,应谨慎使用此方法。 开发人员必须尽量避免在不安全的位置公开访问密钥。 具有访问密钥的任何人都可以授权针对存储帐户的请求,并且实际上有权访问所有数据。 DefaultAzureCredential
提供比帐户密钥更好的管理和安全优势,来实现无密码身份验证。 以下示例演示了这两个选项。
DefaultAzureCredential
支持多种身份验证方法,并确定应在运行时使用哪种方法。 通过这种方法,你的应用可在不同环境(本地与生产)中使用不同的身份验证方法,而无需实现特定于环境的代码。
有关 DefaultAzureCredential
查找凭据的顺序和位置,可查看 Azure 标识库概述。
例如,应用可在本地开发时使用 Azure CLI 登录凭据进行身份验证。 应用在部署到 Azure 后就可以使用托管标识。 此转换不需要进行任何代码更改。
将角色分配至 Microsoft Entra 用户帐户
在本地开发时,请确保访问 Blob 数据的用户帐户具有正确的权限。 需有“存储 Blob 数据参与者”角色才能读取和写入 Blob 数据。 若要为你自己分配此角色,需要具有“用户访问管理员”角色,或者具有包含 Microsoft.Authorization/roleAssignments/write 操作的其他角色。 可使用 Azure 门户、Azure CLI 或 Azure PowerShell 向用户分配 Azure RBAC 角色。 可以在范围概述页上详细了解角色分配的可用范围。
在此方案中,你将为用户帐户分配权限(范围为存储帐户)以遵循最低权限原则。 这种做法仅为用户提供所需的最低权限,并创建更安全的生产环境。
以下示例将“存储 Blob 数据参与者”角色分配给用户帐户,该角色提供对存储帐户中 Blob 数据的读取和写入访问权限。
重要
在大多数情况下,角色分配在 Azure 中传播需要一两分钟的时间,但极少数情况下最多可能需要 8 分钟。 如果在首次运行代码时收到身份验证错误,请稍等片刻再试。
在 Azure 门户中,使用主搜索栏或左侧导航找到存储帐户。
在存储帐户概述页的左侧菜单中选择“访问控制 (IAM)”。
在“访问控制 (IAM)”页上,选择“角色分配”选项卡。
从顶部菜单中选择“+ 添加”,然后从出现的下拉菜单中选择“添加角色分配”。
使用搜索框将结果筛选为所需角色。 在此示例中,搜索“存储 Blob 数据参与者”并选择匹配的结果,然后选择“下一步”。
在“访问权限分配对象”下,选择“用户、组或服务主体”,然后选择“+ 选择成员”。
在对话框中,搜索 Microsoft Entra ID 用户名(通常是 user@domain 电子邮件地址),然后选中对话框底部的“选择”。
选择“查看 + 分配”转到最后一页,然后再次选择“查看 + 分配”完成该过程。
使用 DefaultAzureCredential 登录并将应用代码连接到 Azure
可按照以下步骤授权访问存储帐户中的数据:
确保在存储帐户上向将角色分配到的同一 Microsoft Entra 帐户进行身份验证。 可通过 Azure CLI、Visual Studio Code 或 Azure PowerShell 进行身份验证。
使用以下命令通过 Azure CLI 登录到 Azure:
az login
要使用
DefaultAzureCredential
,请确保已安装“azure-identity”包,并导入类:from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient
在
try
块内添加此代码。 当代码在本地工作站上运行时,DefaultAzureCredential
使用你登录的优先工具的开发人员凭据向 Azure 进行身份验证。 这些工具的示例包括 Azure CLI 或 Visual Studio Code。account_url = "https://<storageaccountname>.blob.core.chinacloudapi.cn" default_credential = DefaultAzureCredential() # Create the BlobServiceClient object blob_service_client = BlobServiceClient(account_url, credential=default_credential)
确保更新
BlobServiceClient
对象的 URI 中的存储帐户名称。 可以在 Azure 门户的概述页上找到存储帐户名称。注意
部署到 Azure 时,同样的代码可用于授权从 Azure 中运行的应用程序对 Azure 存储的请求。 但是,需要在 Azure 中的应用上启用托管标识。 然后,配置你的存储帐户以允许该托管标识进行连接。 有关在 Azure 服务之间配置此连接的详细说明,请参阅 Azure 托管应用中的身份验证教程。
创建容器
通过在 blob_service_client
对象上调用 create_container 方法,在存储帐户中创建新容器。 在此示例中,代码将 GUID 值追加到容器名称,以确保它是唯一的。
将此代码添加到 try
块的末尾:
# Create a unique name for the container
container_name = str(uuid.uuid4())
# Create the container
container_client = blob_service_client.create_container(container_name)
若要详细了解如何创建容器并浏览更多代码示例,请参阅使用 Python 创建 Blob 容器。
重要
容器名称必须为小写。 有关命名容器和 Blob 的详细信息,请参阅命名和引用容器、Blob 和元数据。
将 blob 上传到容器中
使用 upload_blob 将 blob 上传到容器。 示例代码将在本地数据目录中创建文本文件以上传到容器。
将此代码添加到 try
块的末尾:
# Create a local directory to hold blob data
local_path = "./data"
os.mkdir(local_path)
# Create a file in the local data directory to upload and download
local_file_name = str(uuid.uuid4()) + ".txt"
upload_file_path = os.path.join(local_path, local_file_name)
# Write text to the file
file = open(file=upload_file_path, mode='w')
file.write("Hello, World!")
file.close()
# Create a blob client using the local file name as the name for the blob
blob_client = blob_service_client.get_blob_client(container=container_name, blob=local_file_name)
print("\nUploading to Azure Storage as blob:\n\t" + local_file_name)
# Upload the created file
with open(file=upload_file_path, mode="rb") as data:
blob_client.upload_blob(data)
若要详细了解如何上传 Blob 并浏览更多代码示例,请参阅使用 Python 上传 Blob。
列出容器中的 Blob
通过调用 list_blobs 方法,列出容器中的 blob。 在这种情况下,只向容器添加了一个 blob,因此列表操作只返回那个 blob。
将此代码添加到 try
块的末尾:
print("\nListing blobs...")
# List the blobs in the container
blob_list = container_client.list_blobs()
for blob in blob_list:
print("\t" + blob.name)
若要详细了解如何列出 Blob 并浏览更多代码示例,请参阅使用 Python 列出 Blob。
下载 Blob
通过调用 download_blob 方法,下载以前创建的 blob。 示例代码将向文件名添加后缀“DOWNLOAD”,这样你就可以在本地文件系统中看到这两个文件。
将此代码添加到 try
块的末尾:
# Download the blob to a local file
# Add 'DOWNLOAD' before the .txt extension so you can see both files in the data directory
download_file_path = os.path.join(local_path, str.replace(local_file_name ,'.txt', 'DOWNLOAD.txt'))
container_client = blob_service_client.get_container_client(container= container_name)
print("\nDownloading blob to \n\t" + download_file_path)
with open(file=download_file_path, mode="wb") as download_file:
download_file.write(container_client.download_blob(blob.name).readall())
若要详细了解如何下载 Blob 并浏览更多代码示例,请参阅使用 Python 下载 Blob。
删除容器
以下代码使用 delete_container 方法删除整个容器,从而清除该应用所创建的资源。 也可根据需要删除本地文件。
在删除 blob、容器和本地文件之前,应用会调用 input()
以暂停并等待用户输入。 在资源被删除之前验证是否已正确创建这些资源。
将此代码添加到 try
块的末尾:
# Clean up
print("\nPress the Enter key to begin clean up")
input()
print("Deleting blob container...")
container_client.delete_container()
print("Deleting the local source and downloaded files...")
os.remove(upload_file_path)
os.remove(download_file_path)
os.rmdir(local_path)
print("Done")
若要详细了解如何删除容器并浏览更多代码示例,请参阅使用 Python 删除和还原 Blob 容器。
运行代码
此应用会在本地文件夹中创建测试文件,并将其上传到 Azure Blob 存储。 示例随后会列出容器中的 Blob,并下载具有新名称的文件。 可将旧文件和新文件进行比较。
导航到包含“blob_quickstart.py”文件的目录,然后执行以下 python
命令来运行应用:
python blob_quickstart.py
应用的输出类似于以下示例(为便于阅读,省略了 UUID 值):
Azure Blob Storage Python quickstart sample
Uploading to Azure Storage as blob:
quickstartUUID.txt
Listing blobs...
quickstartUUID.txt
Downloading blob to
./data/quickstartUUIDDOWNLOAD.txt
Press the Enter key to begin clean up
Deleting blob container...
Deleting the local source and downloaded files...
Done
在开始清理过程之前,请在“data”文件夹中查看这两个文件。 可以将它们对比,然后就会看到它们完全相同。
清理资源
验证文件并完成测试后,请按 Enter 键删除测试文件以及在存储帐户中创建的容器。 还可以使用 Azure CLI 来删除资源。