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

Flask接口遍历sqlite3文件时for循环迭代失效问题排查

代码存在的核心问题

  • 循环逻辑错误:第一次迭代执行到else分支就直接return jsonify(cvedata),函数直接终止,后续循环完全不会执行
  • 循环变量冗余:你已经用for循环遍历range(len(final_db_files)),完全不需要额外维护x变量,属于多余逻辑
  • 终止逻辑错误:while x >= length: break是无效写法,while只会执行一次判断,完全起不到循环终止的控制作用
  • 资源泄漏:每次打开sqlite连接后没有关闭,多次请求会造成连接堆积
  • 路径处理不规范:直接切换工作目录的写法兼容性差,易出现路径读取错误

修正方案

如果你的需求是单次请求返回所有数据库文件的全部数据,修正后的代码如下:

import os
import sqlite3
from flask import Flask, jsonify

app = Flask(__name__)
# 直接保存目录路径,不需要切换工作目录
db_dir = "/home/yashwanth/Desktop/cve/dbfiles2"
db_files = os.listdir(db_dir)
final_db_files = sorted(db_files)
length = len(final_db_files)


@app.route("/cvedata", methods=["GET"])
def cvedata():
    all_cve_data = []
    # 直接遍历文件列表,不需要额外维护计数变量
    for filename in final_db_files:
        # 简单校验文件名合法性,避免SQL注入风险
        if not filename.replace("_", "").replace("-", "").isalnum():
            continue
        # 拼接完整数据库路径
        file_path = os.path.join(db_dir, filename)
        conn = sqlite3.connect(file_path)
        cursor = conn.execute(f"SELECT * from {filename}")
        # 把当前文件的CVE数据追加到总列表
        for row in cursor.fetchall():
            all_cve_data.append(dict(
                Cve_id=row[0], 
                Description=row[1], 
                Published_Date=row[2], 
                Modified_Date=row[3]
            ))
        # 手动关闭数据库连接,避免资源泄漏
        conn.close()
    # 所有文件遍历完成后统一返回全部数据
    return jsonify(all_cve_data)


if __name__ == "__main__":
    # 替换为实际的监听地址
    app.run(host='0.0.0.0', debug=True)

如果你需求是每次请求返回一个文件的数据,下次请求自动返回下一个文件的内容,则需要把计数变量设为全局并加锁避免并发问题,参考写法如下:

import os
import sqlite3
import threading
from flask import Flask, jsonify

app = Flask(__name__)
db_dir = "/home/yashwanth/Desktop/cve/dbfiles2"
db_files = os.listdir(db_dir)
final_db_files = sorted(db_files)
length = len(final_db_files)
# 全局计数变量 + 线程锁
x = 0
lock = threading.Lock()


@app.route("/cvedata", methods=["GET"])
def cvedata():
    global x
    with lock:
        if x >= length:
            # 超出文件数量后重置计数,也可以根据需求返回结束提示
            x = 0
        filename = final_db_files[x]
        if not filename.replace("_", "").replace("-", "").isalnum():
            x += 1
            return jsonify({"msg": "非法文件名,跳过"}), 400
        file_path = os.path.join(db_dir, filename)
        conn = sqlite3.connect(file_path)
        cursor = conn.execute(f"SELECT * from {filename}")
        cve_data = [dict(
            Cve_id=row[0], 
            Description=row[1], 
            Published_Date=row[2], 
            Modified_Date=row[3]
        ) for row in cursor.fetchall()]
        conn.close()
        x += 1
        return jsonify(cve_data)


if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:36:05