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

Python v2模型Azure Durable Functions绑定CosmosDB、Event Grid报错排查

报错原因分析与解决方案

核心报错原因(结合代码与Durable Functions Python v2特性)

你的代码存在以下关键问题,直接导致运行报错:

  1. Orchestrator函数语法错误:返回语句{"result", connected}使用了集合语法,且connected未定义;Durable Orchestrator要求返回可序列化的合法结构,此处既存在未定义变量,又用错了数据结构(应使用字典{"result": "connected"})。
  2. Activity函数绑定与参数不匹配:装饰器声明了@event_grid_output,但函数参数中未对应添加outputEvent;同时多了未通过装饰器声明的outputblob参数,违反了Python v2模型中绑定与参数一一对应的规则。
  3. Client函数返回值类型错误:函数标注返回func.HttpResponse,但实际返回纯字符串,不符合类型要求。

修复后的完整代码

import azure.functions as func
import azure.durable_functions as df
import logging
import time

app = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="orchestrators/client_function")
@app.durable_client_input(client_name="client")
async def client_function(req: func.HttpRequest, client: df.DurableOrchestrationClient) -> func.HttpResponse:
    instance_id = await client.start_new("orchestrator", None)
    logging.info(f"Started orchestration with ID = '{instance_id}'.")
    # 直接返回等待完成的响应,符合HttpResponse类型要求
    return await client.wait_for_completion_or_create_check_status_response(req, instance_id)

@app.orchestration_trigger(context_name="context")
def orchestrator(context: df.DurableOrchestrationContext) -> dict:
    activity_result = yield context.call_activity('main', '')
    # 修复为合法字典结构,明确返回内容
    return {"result": "connected", "activity_output": activity_result}

@app.cosmos_db_output(arg_name="outputDocument", 
                      database_name="MyDatabase",
                      collection_name="MyCollection",
                      connection_string_setting="MyAccount_COSMOSDB")
@app.event_grid_output(arg_name="outputEvent",
                       topic_endpoint_uri="MyEventGridTopicUriSetting",
                       topic_key_setting="MyEventGridTopicKeySetting")
@app.activity_trigger(input_name="blank")
def main(blank: str, 
         outputDocument: func.Out[func.Document],
         outputEvent: func.Out[str]):
    # 示例:向CosmosDB写入文档
    outputDocument.set(func.Document({
        "id": f"test_{int(time.time())}",
        "message": "Durable Activity Execution",
        "timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
    }))
    # 示例:向Event Grid发送标准格式事件
    event_payload = {
        "id": "1",
        "subject": "durable/activity/completed",
        "data": {"activity_result": "success"},
        "eventType": "DurableActivityCompleted",
        "eventTime": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
        "dataVersion": "1.0"
    }
    outputEvent.set(func.Json(event_payload))
    return "ok"

分步修复说明

  • Orchestrator函数修复:
    • 将错误的集合返回改为合法字典结构,确保所有变量已定义,返回内容可被Durable框架序列化。
  • Activity函数绑定对齐:
    • 删除未声明的outputblob参数,添加与@event_grid_output对应的outputEvent参数,保证装饰器绑定与函数参数完全匹配。
    • 添加CosmosDB和Event Grid的实际输出逻辑,让绑定真正生效(原代码仅声明绑定未使用)。
  • Client函数返回值修复:
    • 直接返回wait_for_completion_or_create_check_status_response的结果,该方法已返回标准func.HttpResponse实例,符合类型标注要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:12:42