Flask中使用SQLAlchemy操作SQLite为何会插入空值行?
问题根因
你的代码没有区分GET/POST请求的处理逻辑,也没有对表单提交做合法性校验,同时没有遵循Post/Redirect/Get(PRG)设计模式,才会出现异常插入空数据、重复插入两条记录的问题。
修复方案
只需要修改app.py中的路由逻辑即可,修正后代码如下:
# 提前引入需要的依赖(如果没加的话补上) from flask import redirect, url_for @app.route('/dashboard/post', methods = ["POST", "GET"]) @login_required def post(): form = Postform() # 仅当POST请求、且表单校验通过时,才执行数据入库操作 if form.validate_on_submit(): posting = Posts( title = form.title.data, content = form.content.data, posting_user = current_user.username, date_posted = datetime.datetime.now().date() ) db.session.add(posting) db.session.commit() flash('你的帖子已发布成功', 'posted') # 提交成功后重定向到当前页,避免用户刷新页面触发重复提交 return redirect(url_for('post')) # GET请求、或表单校验不通过时,直接渲染页面 return render_template("post.html", form = form, loggedin = current_user.is_active)
原代码的问题细节
- 入库逻辑前置:不管请求类型是什么,只要进入路由就先初始化
Posts数据库实体,首次GET访问页面时表单数据为空,一旦判断逻辑有漏洞(比如空字符串被判定为非None值)就会插入空数据 - 没有表单提交校验:没有判断当前请求是否是用户主动提交的表单,也没有触发WTForms的规则校验,容易插入非法数据
- 未遵循PRG模式:表单提交成功后直接渲染模板,用户刷新页面会重新触发上一次的POST请求,导致重复插入记录
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

