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

Azure Function App报错:'str'对象无get属性,请求技术支援

解决Azure Function中AttributeError: 'str' object has no attribute 'get'问题

问题根源

报错的核心原因是:遍历workItemDetails时,其中的item并非预期的字典类型,而是字符串。字符串没有.get()方法,因此触发该AttributeError。

排查步骤

  1. 添加日志确认数据类型
    在循环开头插入日志代码,打印每个item的类型和内容,明确问题所在:
    for item in workItemDetails:
        print(f"Item类型: {type(item)}, Item内容: {item}")  # 新增日志
        openai_prompt = openAIPrompt(item)
        # 后续原有代码
    
  2. 检查workItemDetails的数据源
    • 若从HTTP请求获取:确认是否用req.get_json()正确解析JSON,而非直接读取字符串格式的请求体
    • 若从存储/数据库读取:确认读取后是否执行了json.loads()反序列化,避免将字典列表以字符串形式传入
    • 排查近期代码变更:确认是否修改了workItemDetails的生成逻辑,导致原本的字典列表变成字符串或字符串列表

解决方案

根据排查结果对应处理:

场景1:整个workItemDetails是JSON字符串

如果传入的参数本身是JSON格式的字符串(比如上游误将字典列表序列化成了字符串),先做反序列化处理:

def sendOpenAIPromptRequest(azureopenai_endpoint, azureopenai_deployment,azureopenai_token, azureopenai_version, workItemDetails):
    # 新增:判断是否为字符串,是则反序列化为字典列表
    if isinstance(workItemDetails, str):
        import json
        workItemDetails = json.loads(workItemDetails)
    workItemSummary = []
    # 后续原有代码

场景2:列表内每个元素是JSON字符串

如果workItemDetails是列表,但每个元素是单独的JSON字符串,在循环内逐个反序列化:

for item in workItemDetails:
    # 新增:判断当前item是否为字符串,是则反序列化为字典
    if isinstance(item, str):
        import json
        item = json.loads(item)
    openai_prompt = openAIPrompt(item)
    # 后续原有代码

场景3:修正上游数据源逻辑

如果是上游生成workItemDetails时出现序列化错误(比如接口返回、数据存储环节误处理),直接修改上游代码,确保传递的是字典列表而非字符串或字符串列表。

额外优化建议

  • 避免捕获所有异常:替换空except:为特定异常捕获,防止掩盖其他问题:
    try:
        # 原有请求代码
    except requests.exceptions.RequestException as e:
        print(f"OpenAI请求失败: {str(e)}")
        continue  # 跳过当前item,继续处理下一个(根据业务需求调整)
    except json.JSONDecodeError as e:
        print(f"响应JSON解析失败: {str(e)}")
        continue
    
  • 容错处理OpenAI响应:避免因响应格式变化导致报错:
    # 替换原有直接取值逻辑
    summary = ""
    if responseContent.get('choices') and len(responseContent['choices']) > 0:
        message = responseContent['choices'][0].get('message', {})
        summary = message.get('content', "")
    container = {
        "UserStoryId": item.get("UserStoryId", ""),
        "UserStoryTitle": item.get("UserStoryTitle", ""),
        "UserStoryState":item.get("UserStoryState", ""),
        "UserStoryType": item.get("UserStoryType", ""),
        "Summary": summary
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:12:40