You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Python SDK获取Recovery服务Vault报错:'str'无'get_token'属性

解决Azure Recovery Services Vault列表脚本的AttributeError问题

问题场景

编写Python脚本尝试列出特定资源组下的所有Recovery Service Vaults,能成功获取并验证访问令牌,但遍历vaults时触发以下错误:

File "D:\pythonProject\lib\site-packages\azure\core\pipeline\policies\_authentication.py", line 93, in on_request
    self._token = self._credential.get_token(*self._scopes)
AttributeError: 'str' object has no attribute 'get_token'

错误原因

RecoveryServicesClient的credential参数要求传入凭据对象(如ClientSecretCredential或AccessToken实例),而非直接传入令牌字符串。你错误地将access_token.token(字符串类型)传入,导致客户端尝试调用字符串的get_token方法,从而触发错误。

解决方案

方式一:直接使用ClientSecretCredential(推荐)

Azure SDK会自动处理令牌的获取与刷新,无需手动管理令牌。修改后的完整代码:

from azure.identity import ClientSecretCredential
from azure.mgmt.recoveryservices import RecoveryServicesClient

# 初始化服务主体凭据
tenant_id = "88888888-jhgf-7865-CCCC-XXXXXXXXXXXX"
client_id = "99999999-lkjk-9877-ljhg-YYYYYYYYYYYY"
client_secret = "gfhgfhgvbkjgftyrdthgjklkjlljfhfhgfhg"
subscription_id = "yyyyyyyy-xxxx-kkkk-njjjj-ddddddddddd"

# 创建ClientSecretCredential对象
creds = ClientSecretCredential(
    tenant_id=tenant_id,
    client_id=client_id,
    client_secret=client_secret
)

# 初始化RecoveryServicesClient,直接传入凭据对象
recovery_service_client = RecoveryServicesClient(
    credential=creds,
    subscription_id=subscription_id
)

# 列出指定资源组下的Recovery Services Vaults
resource_group_name = "rg_myexample"
vaults = recovery_service_client.vaults.list_by_resource_group(resource_group_name)

# 遍历并打印Vault信息
for vault in vaults:
    print(f"Vault名称: {vault.name}")
    print(f"Vault ID: {vault.id}")
    print("---")

方式二:手动使用AccessToken实例(如需自定义令牌管理)

若必须手动处理令牌,需将AccessToken实例而非字符串传入credential参数:

from azure.core.credentials import AccessToken
from azure.identity import ClientSecretCredential
from azure.mgmt.recoveryservices import RecoveryServicesClient

# 初始化服务主体凭据
tenant_id = "88888888-jhgf-7865-CCCC-XXXXXXXXXXXX"
client_id = "99999999-lkjk-9877-ljhg-YYYYYYYYYYYY"
client_secret = "gfhgfhgvbkjgftyrdthgjklkjlljfhfhgfhg"
subscription_id = "yyyyyyyy-xxxx-kkkk-njjjj-ddddddddddd"

resource_uri = "https://management.azure.com/"

# 创建ClientSecretCredential对象
creds = ClientSecretCredential(
    tenant_id=tenant_id,
    client_id=client_id,
    client_secret=client_secret
)

# 获取AccessToken实例
token = creds.get_token(resource_uri + "/.default")
access_token = AccessToken(token.token, token.expires_on)

# 初始化RecoveryServicesClient,传入AccessToken实例
recovery_service_client = RecoveryServicesClient(
    credential=access_token,
    subscription_id=subscription_id,
    base_url=resource_uri
)

# 列出并打印Vault信息
resource_group_name = "rg_myexample"
vaults = recovery_service_client.vaults.list_by_resource_group(resource_group_name)

for vault in vaults:
    print(f"Vault名称: {vault.name}")
    print(f"Vault ID: {vault.id}")
    print("---")

关键修改点

  • 方式一:移除手动获取令牌的代码,直接将ClientSecretCredential实例传给RecoveryServicesClient,SDK自动处理令牌生命周期。
  • 方式二:将recovery_service_client初始化时的credential=access_token.token改为credential=access_token,传入AccessToken实例而非字符串。

内容的提问来源于stack exchange,提问作者amitsuneja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:43:21