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
相关产品推荐
相关产品推荐

