用于 Python 的 Azure 库的使用模式

用于 Python 的 Azure SDK 由众多独立的库组成,而这些库已在 Python SDK 包索引中列出。

所有库共享某些常见特征和用法模式,例如,为对象参数安装和使用内联 JSON。

设置本地开发环境

如果尚未设置,则可设置一个能在其中运行此代码的环境。 提供以下选择:

库安装

若要安装特定的库包,请使用 pip install

# Install the management library for Azure Storage
pip install azure-mgmt-storage
# Install the client library for Azure Blob Storage
pip install azure-storage-blob

pip install 在当前 Python 环境中检索库的最新版本。

还可以使用 pip 卸载库和安装特定版本,包括预览版。 有关详细信息,请参阅如何安装用于 Python 的 Azure 库包

异步操作

异步库

众多客户端和管理库均提供异步版本 (.aio)。 asyncio 库自 Python 3.4 起便已推出,而 Python 3.5 中则引入了 async/await 关键字。 这些库的异步版本旨在与 Python 3.5 及更高版本一起使用。

具有异步版本的 Azure Python SDK 库的示例包括:azure.storage.blob.aioazure.servicebus.aioazure.mgmt.keyvault.aioazure.mgmt.compute.aio

这些库需要异步传输(例如 aiohttp)才能生效。 azure-core 库提供由异步库使用的异步传输 AioHttpTransport

以下代码演示如何为 Azure Blob 存储库的异步版本创建客户端:

credential = DefaultAzureCredential()

async def run():

    async with BlobClient(
        storage_url,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
        credential=credential,
    ) as blob_client:

        # Open a local file and upload its contents to Blob Storage
        with open("./sample-source.txt", "rb") as data:
            await blob_client.upload_blob(data)
            print(f"Uploaded sample-source.txt to {blob_client.url}")

        # Close credential
        await credential.close()

asyncio.run(run())

完整示例则位于 GitHub 上的 use_blob_auth_async.py。 有关此代码的同步版本,请参阅示例:上传 Blob

长期运行的操作

调用的某些管理操作(例如 ComputeManagementClient.virtual_machines.begin_create_or_updateWebSiteManagementClient.web_apps.begin_create_or_update)会返回长期操作的轮询器 LROPoller[<type>];其中,<type> 特定于有问题的操作。

注意

你可能会注意到库中各方法名称存在差异,而这源于版本差异。 非基于 azure.core 的旧库通常会使用类似 create_or_update 的名称。 基于 azure.core 的库会向方法名称添加 begin_ 前缀,从而更好地表明它们为长期轮询操作。 将旧代码迁移到基于 azure.core 的新库通常意味着将 begin_ 前缀添加到方法名称中,因为大多数方法签名保持不变。

LROPoller 返回类型表示此操作为异步操作。 相应地,必须调用该轮询器的 result 方法,以等待操作完成并获取结果。

取自示例:创建和部署 Web 应用的以下代码演示了使用轮询器来等待结果的示例:

poller = app_service_client.web_apps.begin_create_or_update(RESOURCE_GROUP_NAME,
    WEB_APP_NAME,
    {
        "location": LOCATION,
        "server_farm_id": plan_result.id,
        "site_config": {
            "linux_fx_version": "python|3.8"
        }
    }
)

web_app_result = poller.result()

在本例中,begin_create_or_update 的返回值为 AzureOperationPoller[Site] 类型,这意味着 poller.result() 的返回值为 Site 对象。

异常

通常情况下,如果操作未能按预期执行(包括对 Azure REST API 的 HTTP 请求失败),Azure 库将引发异常。 对于应用代码,可在库操作周围使用 try...except 块。

有关可能引发的异常类型的详细信息,请参阅相关操作的对应文档。

Logging

最新的 Azure 库使用 Python 标准 logging 库生成日志输出。 可以为单个库、库组或所有库设置日志记录级别。 注册日志记录流处理程序后,便可为特定客户端对象或特定操作启用日志记录。 有关详细信息,请参阅 Azure 库中的日志记录

代理配置

若要指定代理,可使用环境变量或可选参数。 有关详细信息,请参阅如何配置代理

用于客户端对象和方法的可选参数

在库参考文档中,经常会在客户端对象构造函数或特定操作方法的签名中看到 **kwargs**operation_config 参数。 这些占位符表示相关对象或方法可能支持其他命名参数。 通常,参考文档中会指示可以使用的特定参数。 此外,通常还支持一些常规参数,后面部分中对此进行了介绍。

基于 azure.core 的库的参数

这些参数适用于 Python - 新库中列出的那些库。 例如,azure-core 的关键字参数的子集如下。 有关完整列表,请参阅 GitHub 自述文件中的 azure-core

名称 类型 默认 说明
logging_enable bool False 启用日志记录。 有关详细信息,请参阅 Azure 库中的日志记录
代理 dict {} 代理服务器 URL。 有关详细信息,请参阅如何配置代理
use_env_settings 布尔 True 如果为 True,表明允许为代理使用 HTTP_PROXYHTTPS_PROXY 环境变量。 如果为 False,则忽略环境变量。 有关详细信息,请参阅如何配置代理
connection_timeout int 300 建立与 Azure REST API 终结点的连接时所产生的超时时间,以秒计算。
read_timeout int 300 完成 Azure REST API 操作(即等待响应)时所产生的超时时间,以秒计算。
retry_total int 10 允许的 REST API 调用重试次数。 使用 retry_total=0 禁用重试操作。
retry_mode enum 指数 以线性或指数方式应用重试计时。 如果设置为“单次”,则按固定间隔时间进行重试。 如果设置为“指数”,则每次重试距离上一次重试的时间是上一次间隔时间的两倍。

各个库没有义务支持这些参数中的任何一个,因此请务必查阅每个库的参考文档以获取确切的详细信息。 此外,每个库可能会支持其他参数。 例如,对于特定于 Blob 存储的关键字参数,请参阅 GitHub 自述文件中的 azure-storage-blob

对象参数的内联 JSON 模式

Azure 库中的许多操作可用于将对象参数表示为离散对象或内联 JSON。

例如,你有一个 ResourceManagementClient 对象,而通过该对象可使用其 create_or_update 方法来创建资源组。 此方法的第二个参数的类型为 ResourceGroup

若要调用 create_or_update 方法,可直接使用其必要参数(在本例中为 location)来创建一个 ResourceGroup 的离散实例:

# Provision the resource group.
rg_result = resource_client.resource_groups.create_or_update(
    "PythonSDKExample-rg",
    ResourceGroup(location="centralus")
)

或者,可以将相同参数传递为内联 JSON:

# Provision the resource group.
rg_result = resource_client.resource_groups.create_or_update(
    "PythonAzureExample-rg", {"location": "centralus"}
)

使用内联 JSON 时,Azure 库会自动将内联 JSON 转换为相关参数的相应对象类型。

对象也可以具有嵌套对象参数,在这种情况下,也可以使用嵌套 JSON。

例如,假设你有一个 KeyVaultManagementClient 对象的实例,并调用其 create_or_update 方法。 在这种情况下,第三个参数的类型为 VaultCreateOrUpdateParameters,其本身包含 VaultProperties 类型的参数。 而 VaultProperties 包含类型为 Skulist[AccessPolicyEntry] 的对象参数。 Sku 包含 SkuName 对象,且每个 AccessPolicyEntry 均包含 Permissions 对象。

若要使用嵌入对象来调用 begin_create_or_update,请使用如下代码(假设 tenant_idobject_idLOCATION 均已定义)。 还可以在该函数调用之前创建必要的对象。

# Provision a Key Vault using inline parameters
poller = keyvault_client.vaults.begin_create_or_update(
    RESOURCE_GROUP_NAME,
    KEY_VAULT_NAME_A,
    VaultCreateOrUpdateParameters(
        location = LOCATION,
        properties = VaultProperties(
            tenant_id = tenant_id,
            sku = Sku(
                name="standard",
                family="A"
            ),            
            access_policies = [
                AccessPolicyEntry(
                    tenant_id = tenant_id,
                    object_id = object_id,
                    permissions = Permissions(
                        keys = ['all'],
                        secrets = ['all']
                    )
                )
            ]
        )
    )
)

key_vault1 = poller.result()

使用内联 JSON 的相同调用如下所示:

# Provision a Key Vault using inline JSON
poller = keyvault_client.vaults.begin_create_or_update(
    RESOURCE_GROUP_NAME,
    KEY_VAULT_NAME_B,
    {
        'location': LOCATION,
        'properties': {
            'sku': {
                'name': 'standard',
                'family': 'A'
            },
            'tenant_id': tenant_id,
            'access_policies': [{
                'tenant_id': tenant_id,
                'object_id': object_id,                
                'permissions': {
                    'keys': ['all'],
                    'secrets': ['all']
                }
            }]
        }
    }
)

key_vault2 = poller.result()

由于这两种形式是等效的,因此可以根据自己的喜好选择其中一种形式,甚至将它们混合使用。 (可在 GitHub 上找到这些示例的完整代码。)

如果 JSON 格式不正确,通常会收到错误“DeserializationError:无法反序列化为对象:type,AttributeError:'str' 对象缺少属性 'get'”。 此错误的一个常见原因是,当库需要嵌套的 JSON 对象时,你为属性提供了单个字符串。 例如,在前面的示例中使用 'sku': 'standard' 会生成此错误,因为 sku 参数是一个需要内联对象 JSON 的 Sku 对象,在本例中为 {'name': 'standard'},它映射到所需的 SkuName 类型。

后续步骤

了解了有关使用用于 Python 的 Azure 库的常见模式后,请参阅以下独立示例以探索特定的管理和客户端库方案。 你可按任意顺序试用这些示例,因为它们不存在顺序或相互依赖。