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

