如何实现Flask API遍历JSON中每个Picture实例运行本地exe
实现方案与代码示例
核心思路
- 修正原有代码的键名错误:遍历JSON中的
pictures数组(而非你代码里的components) - 从每个
picture对象中提取专属参数,结合全局的folderID、subfolderID调用exe - 用更安全的
subprocess.run()替代os.system(),避免字符串拼接的命令注入风险
完整Flask API代码
from flask import Flask, request import subprocess app = Flask(__name__) @app.route('/process-images', methods=['POST']) def process_images(): # 解析POST请求的JSON数据 payload = request.get_json() # 提取全局必要参数 folder_id = payload.get('folderID') subfolder_id = payload.get('subfolderID') # 参数合法性校验 if not folder_id or not subfolder_id or 'pictures' not in payload: return {"status": "error", "msg": "缺少folderID/subfolderID或pictures数组"}, 400 # 遍历所有picture实例 for pic_item in payload['pictures']: # 提取单张图片的参数 pic_id = pic_item.get('pic') pic_name = pic_item.get('picname') type_id = pic_item.get('typeID') # 跳过参数不全的图片(也可根据需求返回错误) if not pic_id or not pic_name or type_id is None: continue # 构造exe命令(用列表形式避免命令注入,自动处理特殊字符) cmd = [ 'pic_sizer.exe', '-s', subfolder_id, '-f', folder_id, '-p', pic_id, '-pn', pic_name, '-t', str(type_id) # 整数转字符串适配命令格式 ] # 执行命令并捕获结果 result = subprocess.run(cmd, shell=False, capture_output=True, text=True) # 日志记录(可根据需求存入文件或返回给前端) if result.returncode != 0: print(f"图片 {pic_name} 处理失败: {result.stderr}") else: print(f"图片 {pic_name} 处理完成: {result.stdout}") return {"status": "success", "msg": "所有图片处理任务已执行"} if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)
关键细节说明
- 遍历优化:直接循环
payload['pictures']即可,不需要用range(len(...))的索引方式,代码更简洁 - 安全升级:
subprocess.run()传入命令列表,自动处理参数中的空格、特殊字符,避免os.system()字符串拼接带来的命令注入风险 - 参数校验:增加多轮参数检查,避免因参数缺失导致程序崩溃
- 错误排查:捕获exe的执行返回码和输出信息,方便定位处理失败的图片
内容的提问来源于stack exchange,提问作者Kano
相关产品推荐
相关产品推荐

