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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:47:22