教程:从 Python 控制台应用程序调用用户数据函数

可以通过向函数的公共终结点发送 HTTP 请求,从外部应用程序调用 Fabric 用户数据函数。 这样,便可以将 Fabric 业务逻辑集成到 Web 应用、自动化脚本、微服务或 Fabric 环境外部的任何系统。

在本教程中,你将:

  • 注册Microsoft Entra 应用程序进行身份验证
  • 获取函数的公共 URL 并启用公共访问
  • 创建调用函数的 Python 控制台应用程序
  • 了解响应架构和 HTTP 状态代码

先决条件

创建 Microsoft Entra 应用

若要从外部应用程序调用用户数据函数,需要在 Microsoft Entra ID 中注册应用程序。 此应用注册提供 Python 应用程序用来进行身份验证的凭据。

  1. 转到 Microsoft Entra 管理中心 ,并使用快速入门中所述的步骤注册应用程序 :将应用程序注册到Microsoft标识平台

  2. Microsoft Entra 应用 应用程序(客户端)ID目录(租户)ID 值显示在“摘要”框中。 记录这些值,因为稍后需要这些值。

  3. 在“管理”列表下,选择“API 权限”,然后选择“添加权限”

  4. 添加 PowerBI 服务,选择 委派权限,然后选择 UserDataFunction.Execute.All项。Execute.All 权限。 确认不需要管理员同意。

  5. 返回到 “管理 ”设置,然后选择“ 身份验证>添加平台>单页应用程序”。

  6. 出于本地开发目的,请在“重定向 URI”下添加 http://localhost:3000,并确认应用程序是否已启用具有代码交换证明密钥 (PKCE) 的授权代码流 选择“配置”按钮以保存所做更改。 如果应用程序遇到与跨源请求相关的错误,请使用相同的重定向 URI 在上一步中添加 移动和桌面应用程序 平台。

  7. 返回到“授权”,向下滚动到“高级设置”,然后在“允许公共客户端流”下,对“启用以下移动和桌面流”选择“是”

创建控制台应用程序

有了应用注册后,请创建一个 Python 控制台应用程序,用于对用户数据函数进行身份验证和调用。

获取要调用的函数 URL

每个用户数据函数都有一个唯一的公共 URL,用作其 REST API 终结点。 在可以从外部应用程序调用函数之前,需要启用公共访问并获取 URL。

获取函数 URL:

  1. 在 Fabric 门户中,打开用户数据函数项。

  2. 请确保处于 “仅运行 ”模式,而不是 “开发 ”模式。

  3. Functions 资源管理器中,将鼠标悬停在函数的名称上,然后选择省略号(...)。

  4. 选择 属性

  5. 在“属性”窗格中,确保已启用 公共访问 。 如果没有,请选择该切换开关以启用它。

  6. 复制 公共 URL ,以便在 Python 应用程序中使用。

    显示“属性”窗格的屏幕截图,其中启用了“公共访问”和“公共 URL”字段。

    小窍门

    如果已启用公共访问,则可以跳过“属性”窗格。 在 函数资源管理器中,选择函数名称旁边的省略号(...),然后选择 “复制函数 URL”。 这会在“属性”窗格中复制与 公共 URL 相同的 URL

  7. 在应用程序代码中,将 FUNCTION_URL 占位符替换为复制的 URL。

设置 Python 项目

使用虚拟环境创建 Python 项目并安装所需的依赖项。

  1. 例如 my-data-app,为 Python 应用创建新文件夹。

  2. 在 Visual Studio Code 中打开文件夹。

  3. 打开 命令面板Ctrl+Shift+P),并搜索 Python:创建环境

  4. 选择 venv 作为环境类型。

  5. 选择 Python 3.11 作为解释器版本。

  6. 在 Visual Studio Code 中打开新终端(Ctrl+)。

  7. 激活 Python 虚拟环境:

    Windows:

    .venv\Scripts\activate
    

    macOS/Linux:

    source .venv/bin/activate
    
  8. 安装所需的 Python 库:

    pip install azure-identity requests
    

添加应用程序代码

添加使用 Microsoft Entra ID 进行身份验证并调用用户数据函数的 Python 代码。

  1. 在项目文件夹中创建一个名为 app.py 的文件。

  2. 添加以下代码。 将 <REPLACE WITH USER DATA FUNCTION URL> 替换为您之前复制的公共 URL。

    from azure.identity import InteractiveBrowserCredential
    import requests
    import json
    
    # Acquire a token using interactive browser authentication
    # This opens a browser window for the user to sign in with their Microsoft account
    credential = InteractiveBrowserCredential()
    scope = "https://analysis.windows.net/powerbi/api/user_impersonation"
    token = credential.get_token(scope)
    
    if not token.token:
        print("Error: Could not get access token")
        exit(1)
    
    # Prepare headers with the access token
    headers = {
        "Authorization": f"Bearer {token.token}",
        "Content-Type": "application/json"
    }
    
    FUNCTION_URL = "<REPLACE WITH USER DATA FUNCTION URL>"
    
    # Prepare the request data (modify to match your function's expected input)
    data = {"name": "John"}
    
    try:
        # Call the user data function public URL
        response = requests.post(FUNCTION_URL, json=data, headers=headers)
        response.raise_for_status()
        print(json.dumps(response.json(), indent=2))
    except Exception as e:
        print(f"Error: {e}")
    

    注释

    此示例为了简单起见使用 InteractiveBrowserCredential,这将打开浏览器进行交互式登录。 对于生产应用程序,请将您已注册的 Microsoft Entra 应用程序中的client_idtenant_id传递给InteractiveBrowserCredential,或者使用其他凭据类型,例如用于服务到服务身份验证的ClientSecretCredential。 有关详细信息,请参阅 适用于 Python 的 Azure 标识客户端库

运行应用程序

若要运行应用程序,请在终端中使用以下命令:

python app.py

此时会打开一个浏览器窗口,用于使用Microsoft帐户登录。 身份验证后,应用程序将调用用户数据函数并输出响应。

若要在 Visual Studio Code 中调试应用程序,请通过单击行号旁边的边栏来设置断点,然后按 F5 开始调试。 有关详细信息,请参阅 Visual Studio Code 中的 Python 调试

输出架构

从外部应用程序调用用户数据函数时,响应正文遵循以下 JSON 架构:

{
  "functionName": "hello_fabric",
  "invocationId": "1234567890",
  "status": "Succeeded",
  "output": "Hello, John!",
  "errors": []
}

响应包括以下属性:

  • functionName:已执行的函数的名称。
  • invocationId:此特定函数执行的唯一标识符。 非常有助于故障排除和日志关联。
  • status:函数的执行结果。 可能的值为 Succeeded、、BadRequestFailedTimeout、 和 ResponseTooLarge
  • output:函数的返回值。 数据类型和结构取决于函数返回的内容。 例如,如果函数返回字符串, output 则为字符串。 如果函数返回字典, output 则为 JSON 对象。
  • errors:执行期间捕获的错误列表。 每个错误包含一个namemessage,以及可选的properties对象,这些对象中含有键值对和更多详细信息。 函数成功时为空。

响应代码

由于执行,该函数返回以下 HTTP 代码。

响应代码 Message 说明
200 成功 请求成功。
400 错误的请求 请求无效。 此响应可能是由于输入参数值、数据类型或名称缺失或不正确的。 此响应也可能由为函数关闭公共访问导致的。
403 已禁止 响应太大,调用失败。
408 请求超时 由于执行时间超过允许的最大时间,请求失败。
409 冲突 由于存在冲突状态,无法完成请求。 此错误可能是由未经处理的异常或用户凭据错误引起的。
422 错误的请求 请求由于函数中引发的 UserThrownError 而失败。
500 内部服务器错误 请求由于服务中的内部错误而失败。