Python 配置提供者

Python 包

Azure 应用配置是一项托管服务,可帮助开发人员轻松且安全地集中管理其应用程序配置。 Python 配置提供程序库允许以托管方式从 Azure 应用配置存储加载配置。 此客户端库在用于 Python 的 Azure SDK 的基础上添加了其他 功能

安装软件包

使用 pip 安装 Azure 应用配置提供程序包:

pip install azure-appconfiguration-provider

若要使用 Microsoft Entra ID,还需要 Azure 标识。

pip install azure-identity

加载配置

load 中的 azure-appconfiguration-provider 函数用于从 Azure 应用配置加载配置。 该 load 函数允许使用 Microsoft Entra ID(建议)或连接字符串连接到应用程序配置存储区。

注释

azure-appconfiguration-provider 同时具有同步 from azure.appconfiguration.provider import load 版本和异步 from azure.appconfiguration.provider.aio import load 版本。 使用异步版本时,需要使用异步凭据 from azure.identity.aio import DefaultAzureCredential

使用 DefaultAzureCredential 向应用程序配置存储区进行身份验证。 按照说明为凭据分配“应用程序配置数据读取者”角色。

from azure.appconfiguration.provider import load
from azure.identity import DefaultAzureCredential

endpoint = "your-endpoint"
credential = DefaultAzureCredential()

# Connect to Azure App Configuration using a token credential and load all key-values with no label.
config = load(endpoint=endpoint, credential=credential)
print(config["message"]) # value of the key "message" from the App Configuration store

load 函数返回一个实例,该实例 AzureAppConfigurationProvider类似于字典的对象,包含从应用程序配置存储区加载的所有配置值。 默认情况下,提供程序从存储中加载所有未带标签的配置值。

JSON 内容类型处理

可以在应用配置 中创建 JSON 键值 。 从 Azure 应用配置加载键值时,配置提供程序会自动将有效 JSON 内容类型(例如 application/json)的键值转换为反序列化的 Python 对象。

{
    "key": "font",
    "label": null,
    "value": "{\r\n\t\"size\": 12,\r\n\t\"color\": \"red\"\r\n}",
    "content_type": "application/json"
}

此 JSON 内容会导致键值被加载为 { size: 12, color: "red" }

appConfig = load(endpoint, credential)
size = appConfig["font"]["size"]
color = appConfig["font"]["color"]

使用选择器加载特定键值

默认情况下,load 方法从配置存储中加载所有没有标签的配置。 可以通过load的可选参数配置selects方法的行为,该参数是一个SettingSelector的列表。

from azure.appconfiguration.provider import load, SettingSelector
from azure.identity import DefaultAzureCredential

selects = [
    SettingSelector(key_filter="*", label_filter="\0"),  # Empty label
    SettingSelector(key_filter="*", label_filter="dev")  # 'dev' label
]
config = load(endpoint=endpoint, credential=DefaultAzureCredential(), selects=selects)

注释

键值会按选择器列出的顺序加载。 如果多个选择器检索具有相同键的键值,则最后一个选择器中的值将替代以前加载的任何值。

从快照加载配置

可以使用中的snapshot_nameSettingSelector加载配置设置。 指定快照名称时,将加载该快照中的所有配置设置。 snapshot_name参数不能用于key_filterlabel_filtertag_filters

from azure.appconfiguration.provider import load, SettingSelector
from azure.identity import DefaultAzureCredential

snapshot_selects = [SettingSelector(snapshot_name="SnapshotName")]
config = load(endpoint=endpoint, credential=DefaultAzureCredential(), selects=snapshot_selects)

注释

如果使用版本 2.3.0 或更高版本的 azure-appconfiguration-provider 包,则可以使用快照支持。 只有使用组合类型 Key 创建的快照才能使用配置提供程序加载。

剪裁键

可以通过load参数向trim_prefixes函数提供一个要去除的键前缀列表来实现去除键前缀。

from azure.appconfiguration.provider import load
from azure.identity import DefaultAzureCredential

trim_prefixes = ["App1/"]
config = load(endpoint=endpoint, credential=DefaultAzureCredential(), trim_prefixes=trim_prefixes)
print(config["message"])  # Access the key "message" instead of "/application/message"

配置刷新

可以将提供程序配置为从应用程序配置存储区拉取最新设置,而无需重启应用程序。 可以使用 refresh_on 参数来启用此行为。 参数 refresh_on 是一个 List[WatchKey],它指定一个或多个需要监视其变化的键/标签。 在服务器上检测到所选键值的任何更改时,将更新加载的配置。 默认情况下,使用刷新间隔为 30 秒,但可以使用参数替代它 refresh_interval

on_refresh_success仅当检测到更改且未发生错误时,才会调用该回调。 刷新 on_refresh_error 失败时调用回调。

from azure.appconfiguration.provider import load, WatchKey
from azure.identity import DefaultAzureCredential

def my_callback_on_success():
    # Do something on success
    pass

def my_callback_on_fail(error):
    # Do something on fail
    pass

config = load(
    endpoint=endpoint,
    credential=DefaultAzureCredential(),
    refresh_on=[WatchKey("Sentinel")],
    refresh_interval=60,
    on_refresh_success=my_callback_on_success,
    on_refresh_error=my_callback_on_fail
)

单独设置 refresh_on 不会自动刷新配置。 需要调用由 refresh 方法返回的 AzureAppConfigurationProvider 实例上的 load 方法,以触发刷新。

config.refresh()

此设计可防止应用程序处于空闲状态时对应用程序配置发出不必要的请求。 应在发生应用程序活动时包含 refresh 调用。 此过程称为 活动驱动的配置刷新。 例如,可以在处理传入请求时或在执行复杂任务的迭代中调用 refresh。 如果刷新失败,将会抛出错误,除非提供了 on_refresh_error。 如果刷新间隔尚未到期,refresh 方法将不会执行任何操作(即为 no-op)。 此外,一次只能进行一次刷新检查,如果刷新正在进行,则返回为 no-op。

功能标志

可以在 Azure 应用程序配置中创建功能标志。 默认情况下,配置提供程序不会加载功能标志。 可以通过 feature_flags_enabled 参数启用加载和刷新特性标志。

config = load(endpoint=endpoint, credential=DefaultAzureCredential(), feature_flags_enabled=True)
alpha = config["feature_management"]["feature_flags"]["Alpha"]
print(alpha["enabled"])

默认情况下,当 feature_flags_enabled 设置为 True 时,将加载所有无标签的功能标志。 如要加载带有特定标签的功能标志,可以使用 feature_flag_selectors 参数来筛选这些功能标志。该参数会接收一个由 SettingSelector 对象组成的列表。

from azure.appconfiguration.provider import load, SettingSelector

config = load(
    endpoint=endpoint, 
    credential=DefaultAzureCredential(), 
    feature_flags_enabled=True, 
    feature_flag_selectors=[SettingSelector(key_filter="*", label_filter="dev")]
)
alpha = config["feature_management"]["feature_flags"]["Alpha"]
print(alpha["enabled"])

注释

若要有效地使用和管理从 Azure 应用配置加载的功能标志,请安装和使用 featuremanagement 库。 此库提供了一种结构化方法来控制应用程序中的功能行为。

功能管理

功能管理库提供了一种基于功能标志开发和公开应用程序功能的方法。 功能管理库旨在与配置提供程序库协同工作。 配置提供程序将所有选定的功能标志加载到feature_flags 部分中的 feature_management 列表下的配置中。 功能管理库使用和管理应用程序的已加载功能标志。

以下示例演示如何将 featuremanagement 库与配置提供程序集成,以根据功能开关的状态动态控制 Express 应用程序中的 API 访问。

from azure.appconfiguration.provider import load
from featuremanagement import FeatureManager

config = load(endpoint=endpoint, credential=DefaultAzureCredential(), feature_flags_enabled=True)
feature_manager = FeatureManager(config)

print(f"Beta is: {feature_manager.is_enabled("Beta")}")

有关如何使用 Python 功能管理库的详细信息,请转到 功能标志快速入门

功能标志刷新

若要为功能标志启用刷新,需要设置 feature_flag_refresh_enabled=True。 此参数允许提供程序以与刷新配置相同的方式刷新功能标志。 与配置不同,所有加载的功能标志都会受到监视,以进行更改并导致刷新。 刷新配置设置和特性标志是相互独立的。 配置设置和功能标志均由 refresh 该方法更新,但功能标志更改不会导致配置刷新,反之亦然。 此外,如果未启用配置设置的刷新,仍可以启用功能标志进行刷新。

config = load(
    endpoint=endpoint, 
    credential=DefaultAzureCredential(), 
    feature_flags_enabled=True, 
    feature_flag_refresh_enabled=True
)

# Later in your code
config.refresh()

密钥保管库引用

Azure 应用程序配置支持引用存储在 Azure Key Vault 中的机密。 在应用程序配置中,可以创建映射到 Key Vault 中存储的机密的密钥。 机密安全地存储在 Key Vault 中,但加载后可以像其他配置一样访问。

配置提供程序库可检索 Key Vault 引用,就如同检索存储在应用程序配置中的任何其他密钥一样。 由于客户端将密钥识别为 Key Vault 引用,它们具有唯一的内容类型,因此客户端连接到 Key Vault 以检索密钥的值供应用程序使用。 需要通过提供凭据或提供客户端来配置连接到 Key Vault 的方法。

使用凭据

您可以使用凭据来设置参数 keyvault_credential ,所有密钥保管库的引用都凭此解析。 提供程序尝试连接到凭据所引用的任何密钥保管库。

from azure.appconfiguration.provider import load, AzureAppConfigurationKeyVaultOptions
from azure.identity import DefaultAzureCredential

config = load(endpoint=endpoint, credential=DefaultAzureCredential(), keyvault_credential=DefaultAzureCredential())

与客户一起

可以使用客户端配置的字典设置参数 keyvault_client_configs

from azure.appconfiguration.provider import load
from azure.identity import DefaultAzureCredential

secret_clients = {
    key_vault_uri: {
        'credential': DefaultAzureCredential()
    }
}

config = load(endpoint=endpoint, credential=DefaultAzureCredential(), keyvault_client_configs=secret_clients)

注释

提供的任何额外属性都将传递到SecretClient 的创建过程。

机密解析器

如果未提供凭据或客户端,则可以使用私密解析器。 机密解析器提供了一种方法,可将您希望的任何值返回给密钥保管库引用。

from azure.appconfiguration.provider import load
from azure.identity import DefaultAzureCredential

def secret_resolver(uri):
    return "From Secret Resolver"

config = load(endpoint=endpoint, credential=DefaultAzureCredential(), secret_resolver=secret_resolver)

异地复制

Azure 应用配置提供程序库会自动发现提供的配置存储的副本,并在出现任何问题时使用副本。 有关详细信息,请参阅 异地复制

默认情况下启用副本发现。 如果要禁用它,可以设置为 replica_discovery_enabledFalse.

from azure.appconfiguration.provider import load
from azure.identity import DefaultAzureCredential

config = load(
    endpoint=endpoint, 
    credential=DefaultAzureCredential(), 
    replica_discovery_enabled=False
)

后续步骤

若要了解如何使用 Python 配置提供程序,请继续学习以下教程。

若要查看如何在 Web 应用程序中使用提供程序,请查看 Django 和 Flask 示例。