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

Flask应用保存API搜索结果至CSV后无法渲染页面的解决咨询

问题原因

Azure Cognitive Search 的search_client.search()返回的是一次性迭代器,当你在save_results里遍历完这个迭代器后,它内部的指针已经走到末尾,后续再传给模板渲染时就没有数据了。另外你的save_results函数还有个问题:每次循环都用'w'模式打开文件,这会覆盖之前写入的内容,最终CSV里只会留下最后一条结果。

解决方案
  1. 将迭代器转换为列表,这样可以多次遍历使用
  2. 修复CSV写入逻辑,避免覆盖已有内容,同时可按需添加表头

修改后的代码

1. 调整搜索结果处理(转成列表)

在search视图函数中,把返回的迭代器转换成列表,确保数据可复用:

@app.route("/search", methods=['GET'])
def search():
    # 获取搜索关键词
    search_text = request.args["search"]
    
    # 将搜索结果转换为列表,避免迭代器耗尽
    results = list(search_query(search_text))
    
    # 保存结果到CSV
    save_results(search_text, results)
    
    # 渲染模板,此时列表仍有完整数据
    return render_template("search.html", search_results=results, search_terms=search_text)

2. 修复CSV保存函数

import csv

def save_results(search_text, results):
    # 使用追加模式('a')写入,避免覆盖已有内容
    with open('search_results.csv', 'a', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        
        # 检查文件是否为空,为空则写入表头
        file.seek(0, 2)  # 移动到文件末尾
        if file.tell() == 0:
            writer.writerow(['搜索文本', '存储文件名', '搜索得分'])
        
        # 遍历所有结果写入
        for result in results:
            writer.writerow([
                search_text,
                result['metadata_storage_name'],
                result['@search.score']
            ])
    # with语句会自动关闭文件,无需手动调用file.close()

3. 可选:直接在查询函数返回列表

如果想让search_query直接返回可复用的列表,也可以修改它:

def search_query(search_text):
    try:
        azure_credential = AzureKeyCredential(search_key)
        search_client = SearchClient(search_endpoint, search_index, azure_credential)
        # 直接返回列表形式的结果
        return list(search_client.search(search_text))
    except Exception as ex:
        raise ex

这样修改后,既可以正常保存所有结果到CSV文件,也能在网页上渲染完整的搜索结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:45:21