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

Flask处理POST表单请求时数据无法写入数据库的问题

问题根因

你的代码有两个核心问题导致数据无法写入数据库:

  • 请求方法判断逻辑不生效:Flask 中 request.method 返回的 HTTP 方法名是全大写格式,你写的判断条件 request.method == 'post' 用了小写字符串,条件永远为假,POST 请求提交后的入库代码根本不会执行。
  • 未初始化数据库表:你只定义了 Todo 模型类,但从未触发 SQLAlchemy 的建表操作,数据库里根本没有对应存储数据的表,就算逻辑走到入库步骤也会抛出表不存在的错误。
修复方案
  1. 把路由方法列表、请求方法判断里的小写方法名改成全大写,匹配Flask的返回值规则
  2. 在应用启动时、模型定义完成后,在Flask应用上下文中执行db.create_all()生成对应数据表
  3. 可选优化:添加提交后重定向逻辑避免表单重复提交,查询已有待办传给前端展示
修复后完整代码

后端Python代码:

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todos.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(), nullable=False)

# 应用启动时自动创建数据表
with app.app_context():
    db.create_all()

@app.route('/' , methods=['POST', 'GET'])
def index():
    if request.method == 'POST':
        todo_title = request.form.get('title', '').strip()
        if todo_title:
            new_todo = Todo(title=todo_title)
            db.session.add(new_todo)
            db.session.commit()
            return redirect(url_for('index'))
    # 查询所有待办传给前端
    todo_list = Todo.query.order_by(Todo.id.desc()).all()
    return render_template('index.html', todos=todo_list)

if __name__ == '__main__':
    app.run(debug=True)

前端模板(原有表单无需修改,补充待办展示逻辑即可):

<form method="post">
        <div class="container">
            <input type="text" name="title" class="form-control" placeholder="Title" required><br>
            <button type="submit" class="btn btn-primary">Add Todo</button>
            
            <!-- 新增待办列表展示 -->
            <ul class="list-group mt-4">
                {% for todo in todos %}
                <li class="list-group-item">{{ todo.id }}. {{ todo.title }}</li>
                {% endfor %}
            </ul>
        </div>
</form>
验证说明
  • 首次运行修复后的代码,项目根目录会自动生成todos.db文件,证明表创建成功
  • 提交表单后页面会自动刷新,新添加的待办会直接展示在列表中,数据已成功写入数据库

内容的提问来源于stack exchange,提问作者Flumy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:33:25