Flask接收Android多POST请求时重复写入数据问题求助
问题分析与解决方案
问题根源
所有生成文件内容一致的核心原因是直接将Flask的request.form传递给多进程池异步任务。Flask的request对象是线程局部上下文对象,当apply_async提交任务后,子进程执行时原请求上下文可能已被后续请求覆盖,导致所有子进程最终读取到的是同一请求的request.form数据。此外,request.form是ImmutableMultiDict类型,跨进程传递这类非标准可序列化对象会加剧上下文共享问题。
修复后的代码
from flask import Flask, request from multiprocessing import Pool import json, random from time import time pool = "" app = Flask(__name__) def writeToFile(callingFrom, content): # 时间戳+随机数生成唯一文件名,避免重复 file_suffix = f"{int(time())}_{random.randint(1, 99999)}" with open(f"{callingFrom}_{file_suffix}.txt", "w", encoding="utf-8") as fp: json.dump(content, fp, ensure_ascii=False) @app.route('/recieve_file.php', methods=['POST']) def recieve_file(): # 将request.form转换为普通字典,脱离请求上下文 form_data = dict(request.form) # 传递独立的数据副本给子进程 pool.apply_async(writeToFile, ['FILE', form_data]) # 修正拼写错误 return json.dumps("receive_file") if __name__ == '__main__': pool = Pool(processes=30) app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 app.run(host='0.0.0.0', port=80, debug=True, threaded=True)
关键修改点
- 提前提取请求数据:在视图函数内将
request.form转为普通字典,确保传递给子进程的是脱离请求上下文的独立数据副本,彻底避免后续请求覆盖问题。 - 优化文件操作:使用
with语句自动管理文件句柄,避免手动关闭可能引发的资源泄漏;结合时间戳+随机数生成文件名,比单纯随机数更能保证唯一性。 - 修正拼写错误:将返回内容的"ecieve_file"改为正确的"receive_file",规范代码表述。
额外提示
如果请求载荷包含嵌套复杂结构,可使用copy.deepcopy(dict(request.form))生成完全独立的深度副本,确保数据隔离性。
内容的提问来源于stack exchange,提问作者Saud Sarnaik
相关产品推荐
相关产品推荐

