import os, uuid
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient
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 数据
将 blob 上传到容器中
列出容器中的 blob
下载 blob
向 Azure 进行身份验证并授权访问 Blob 数据
对 Azure Blob 存储的应用程序请求必须获得授权。 要在代码中实现与 Azure 服务(包括 Blob 存储)的无密码连接,推荐使用 azure-identity 客户端库提供的 DefaultAzureCredential 类。
你还可以使用帐户访问密钥授权对 Azure Blob 存储的请求。 但是,应谨慎使用此方法。 开发人员必须尽量避免在不安全的位置公开访问密钥。 具有访问密钥的任何人都可以授权针对存储帐户的请求,并且实际上有权访问所有数据。 DefaultAzureCredential 提供比帐户密钥更好的管理和安全优势,来实现无密码身份验证。 以下示例演示了这两个选项。
无密码(推荐)
连接字符串
DefaultAzureCredential 支持多种身份验证方法,并确定应在运行时使用哪种方法。 通过这种方法,你的应用可在不同环境(本地与生产)中使用不同的身份验证方法,而无需实现特定于环境的代码。
有关 DefaultAzureCredential 查找凭据的顺序和位置,可查看 Azure 标识库概述。
例如,应用可在本地开发时使用 Azure CLI 登录凭据进行身份验证。 应用在部署到 Azure 后就可以使用托管标识。 此转换不需要进行任何代码更改。
将角色分配给 Azure AD 用户帐户
在本地开发时,请确保访问 Blob 数据的用户帐户具有正确的权限。 需有“存储 Blob 数据参与者”角色才能读取和写入 Blob 数据。 若要为你自己分配此角色,需要具有“用户访问管理员”角色,或者具有包含 Microsoft.Authorization/roleAssignments/write 操作的其他角色。 可使用 Azure 门户、Azure CLI 或 Azure PowerShell 向用户分配 Azure RBAC 角色。 可以在范围概述页上详细了解角色分配的可用范围。
在此方案中,你将为用户帐户分配权限(范围为存储帐户)以遵循最低权限原则。 这种做法仅为用户提供所需的最低权限,并创建更安全的生产环境。
以下示例将“存储 Blob 数据参与者”角色分配给用户帐户,该角色提供对存储帐户中 Blob 数据的读取和写入访问权限。
在大多数情况下,角色分配在 Azure 中传播需要一两分钟的时间,但极少数情况下最多可能需要 8 分钟。 如果在首次运行代码时收到身份验证错误,请稍等片刻再试。
使用搜索框将结果筛选为所需角色。 在此示例中,搜索“存储 Blob 数据参与者”并选择匹配的结果,然后选择“下一步”。
在“访问权限分配对象”下,选择“用户、组或服务主体”,然后选择“+ 选择成员”。
在对话框中,搜索 Azure AD 用户名(通常为 user@domain 电子邮件地址),然后选择对话框底部的“选择”。
选择“查看 + 分配”转到最后一页,然后再次选择“查看 + 分配”完成该过程。
若要使用 Azure CLI 在资源级别分配角色,必须先使用 az storage account show 命令检索资源 ID。 可以使用 --query 参数筛选输出属性。
az storage account show --resource-group '<your-resource-group-name>' --name '<your-storage-account-name>' --query id
复制上述命令的输出 Id。 然后,可以使用 Azure CLI 的 az role 命令分配角色。
az role assignment create --assignee "<user@domain>" \
--role "Storage Blob Data Contributor" \
--scope "<your-resource-id>"
若要使用 Azure PowerShell 在资源级别分配角色,首先必须使用 Get-AzResource 命令检索资源 ID。
Get-AzResource -ResourceGroupName "<yourResourceGroupname>" -Name "<yourStorageAccountName>"
复制上述命令输出中的 Id 值。 然后,可以使用 PowerShell 中的 New-AzRoleAssignment 命令分配角色。
New-AzRoleAssignment -SignInName <user@domain> `
-RoleDefinitionName "Storage Blob Data Contributor" `
-Scope <yourStorageAccountId>
使用 DefaultAzureCredential 登录并将应用代码连接到 Azure
可按照以下步骤授权访问存储帐户中的数据:
确保在存储帐户上向将角色分配到的同一 Azure AD 帐户进行身份验证。 可通过 Azure CLI、Visual Studio Code 或 Azure PowerShell 进行身份验证。
Azure CLI
Visual Studio Code
PowerShell
需要安装 Azure CLI 才能通过 Visual Studio Code 使用 DefaultAzureCredential。
在 Visual Studio Code 的主菜单上,导航到“终端”>“新建终端”。
使用以下命令通过 Azure CLI 登录到 Azure:
az login
要使用 DefaultAzureCredential,请确保已安装“azure-identity”包,并导入类:
from azure.identity import DefaultAzureCredential
在 try 块内添加此代码。 当代码在本地工作站上运行时,DefaultAzureCredential 使用你登录的优先工具的开发人员凭据向 Azure 进行身份验证。 这些工具的示例包括 Azure CLI 或 Visual Studio Code。
account_url = "https://<storageaccountname>.blob.core.windows.net"
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 托管应用中的身份验证教程。
可以使用 Get-AzStorageAccount 和 Get-AzStorageAccountKey 命令通过 PowerShell 组合连接字符串。
$saName = "yourStorageAccountName"
$rgName = "yourResourceGroupName"
$sa = Get-AzStorageAccount -StorageAccountName $saName -ResourceGroupName $rgName
$saKey = (Get-AzStorageAccountKey -ResourceGroupName $rgName -Name $saName)[0].Value
'DefaultEndpointsProtocol=https;AccountName=' + $saName + ';AccountKey=' + $saKey + ';EndpointSuffix=core.windows.net'
在复制连接字符串后,请将其写入到运行该应用程序的本地计算机上的新环境变量。 若要设置环境变量,请打开控制台窗口,并遵照适用于操作系统的说明。 将 <yourconnectionstring> 替换为实际的连接字符串。
Windows:
setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"
在 Windows 中添加环境变量后,必须启动命令窗口的新实例。
Linux :
export AZURE_STORAGE_CONNECTION_STRING="<yourconnectionstring>"
下面的代码从之前创建的环境变量中检索存储帐户的连接字符串,并使用连接字符串构造服务客户端对象。
在 try 块内添加此代码:
# Retrieve the connection string for use with the application. The storage
# connection string is stored in an environment variable on the machine
# running the application called AZURE_STORAGE_CONNECTION_STRING. If the environment variable is
# created after the application is launched in a console or with Visual Studio,
# the shell or application needs to be closed and reloaded to take the
# environment variable into account.
connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING')
# Create the BlobServiceClient object
blob_service_client = BlobServiceClient.from_connection_string(connect_str)
应谨慎使用帐户访问密钥。 如果帐户访问密钥丢失或意外放置在不安全的位置,服务可能会变得易受攻击。 具有访问密钥的任何人都可以授权针对存储帐户的请求,并且实际上有权访问所有数据。 DefaultAzureCredential 提供增强的安全功能和优势,是管理 Azure 服务授权的推荐方法。
确定新容器的名称。 以下代码将 UUID 值追加到容器名称,确保其是唯一的。
容器名称必须为小写。 有关命名容器和 Blob 的详细信息,请参阅命名和引用容器、Blob 和元数据。
调用 create_container 方法在存储帐户中实际创建容器。
将此代码添加到 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 上传到容器中
以下代码片段:
创建用于保存数据文件的本地目录。
在本地目录中创建文本文件。
通过从创建容器部分中调用 BlobServiceClient 上的 get_blob_client 方法,获取对 BlobClient 对象的引用。
通过调用 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...
在开始清理过程之前,请在“data”文件夹中查看这两个文件。 可以将它们对比,然后就会看到它们完全相同。
验证文件并完成测试后,请按 Enter 键删除测试文件以及在存储帐户中创建的容器。 还可以使用 Azure CLI 来删除资源。
本快速入门介绍了如何使用 Python 上传、下载和列出 blob。
若要查看 Blob 存储示例应用,请继续执行以下操作:
适用于 Python 示例的 Azure Blob 存储库
有关详细信息,请参阅适用于 Python 的 Azure Blob 存储客户端库。
有关教程、示例、快速入门和其他文档,请访问面向 Python 开发人员的 Azure。