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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:45:11