Flask不同路由读写同一文件数据不一致问题求解
问题原因
- 你使用相对路径读取/写入
file.txt,当Flask运行在多线程/多进程模式(包括默认开启的调试重载模式)下,不同进程的工作目录可能不一致,导致写入和读取的不是同一个文件 - 文件操作未显式指定编码,不同系统的默认编码差异会导致读写内容出现乱码,看起来和写入内容不一致
r+配合truncate的写入方式不够稳妥,容易因为文件指针位置异常出现内容残留
修复方案
- 固定
file.txt的绝对路径,确保读写的是同一个文件 - 替换写入逻辑为
w模式打开文件,自动清空原有内容,无需手动调用truncate - 所有文件操作都显式指定编码为utf-8,避免编码乱码问题
- 若使用调试模式,添加
use_reloader=False参数关闭重载进程,避免多进程导致的路径不一致问题
修复后代码示例
前置路径配置
import os # 提前定义file.txt的绝对路径,基于当前py文件所在目录生成 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) FILE_PATH = os.path.join(BASE_DIR, "file.txt")
根路由写入逻辑
#default page of our web-app @app.route('/',methods=['GET','POST']) def home(): if request.method == "POST": date = request.form["date"] region =request.form["region"] print("REGION:HOME",region) # 用w模式打开自动清空原有内容,显式指定utf-8编码,with语法自动处理文件关闭 with open(FILE_PATH, "w", encoding="utf-8") as f: f.write(region) return render_template("index.html")
/download路由读取逻辑
@app.route('/download') def download_file(): ''' 处理文件下载请求 ''' # 用相同的绝对路径读取,指定utf-8编码 with open(FILE_PATH, "r", encoding="utf-8") as f: reg = f.read() print("REGION:DOWNLOAD" ,reg) p = "download.csv" # 如果download.csv也出现路径问题,可以用和FILE_PATH相同的逻辑生成绝对路径 return send_file(p,as_attachment=True)
启动代码调整(仅开启调试模式时需要)
if __name__ == '__main__': # 关闭重载器避免多进程读写异常 app.run(debug=True, use_reloader=False)
内容的提问来源于stack exchange,提问作者Asad Khalil
相关产品推荐
相关产品推荐

