Flask多模板表单数据写入CSV同Row换行功能异常问题求解
问题根源
- 核心逻辑缺陷:HTTP请求是无状态的,你现在分两次请求写入文件的逻辑,遇到多用户同时操作时会出现不同用户的数据串到同一行的严重问题,你当前的换行问题本质上也是这种拆分写入逻辑的衍生问题。
- 代码存在冗余和语法错误:
- 没必要用
io.StringIO读写普通字符串,直接操作字符串即可 - final=1分支的
f.write(str("\n")缺少右括号,存在语法错误 - 手动拼接逗号生成CSV的方式容错性极差,一旦表单值本身包含逗号,CSV格式会直接错乱
- 没必要用
- 分多次追加写入文件时,容易因为文件缓冲、其他程序占用等问题导致写入位置异常,也就是你遇到的后段数据被写到新行的问题。
修复方案
推荐改成「前序表单数据暂存在session,最后一次提交时一次性写入整行CSV」的逻辑,从根源上避免上述问题。
第一步:启用Flask Session配置
from flask import Flask, session, request, render_template import csv app = Flask(__name__) # 自定义secret key,用于session加密 app.secret_key = 'your_custom_secret_key_here'
第二步:修改路由逻辑
@app.route('/sintomas', methods=['GET','POST']) def sintomas(): if request.method == 'POST': # 把第一个表单的数据存到当前用户的session里 session['first_form_data'] = list(request.form.to_dict().values()) return render_template('nuevaplantilla6.html') @app.route('/signos', methods=['GET','POST']) def sintomas2(): if request.method == 'POST': # 合并两次表单的数据 first_data = session.pop('first_form_data', []) second_data = list(request.form.to_dict().values()) full_row = first_data + second_data # 一次性写入整行到CSV with open('covid.csv', 'a', encoding='utf-8', newline='') as f: writer = csv.writer(f) writer.writerow(full_row) return render_template('plantilla7.html')
优势
- 完全避免多用户数据串扰问题,每个用户的数据独立存储
- 用Python自带的
csv模块处理CSV写入,自动处理转义、分隔符等问题,不会出现格式错乱 - 整行一次性写入,不会出现拆分写入导致的换行异常问题
内容的提问来源于stack exchange,提问作者Blas Eduardo Bocanegra Uribe
相关产品推荐
相关产品推荐

