Flask最小待办应用需正确串联request.form、redirect和render_template,采用Post-Redirect-Get模式避免重复提交;须显式建表并确保主键定义;删除功能应通过POST表单实现而非GET。

Flask 本身不提供数据库或前端模板的强制方案,但用 sqlite3 + 原生 HTML 就能跑通最小可用待办应用——关键不是“全栈”,而是把 request.form、redirect 和 render_template 这三者串对。
怎么让表单提交后不刷新页面还能更新列表?
别一开始就上 AJAX。先确保后端路由能正确接收 POST、写入数据库、再重定向回 GET 页面(即“Post-Redirect-Get”模式)。这是避免重复提交和页面状态错乱的基础。
-
app.py中定义两个路由:@app.route('/', methods=['GET'])渲染页面,@app.route('/', methods=['POST'])处理新增任务 - POST 路由里必须调用
return redirect(url_for('index')),不能直接render_template,否则刷新会二次提交 - 前端 form 的
method="POST"和action="/"要匹配,否则 405 Method Not Allowed
SQLite 插入新任务时为什么总报 no such table?
Flask 不自动建表,sqlite3 连接也不会帮你检查 schema。必须在应用启动时显式执行建表语句,且只执行一次。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 不要在每次请求里
execute("CREATE TABLE IF NOT EXISTS ...")—— 虽然加了IF NOT EXISTS,但频繁执行有开销 - 推荐做法:在
app.py顶部加一个init_db()函数,用with app.app_context():包裹后手动调用一次 - 建表 SQL 必须包含主键(如
id INTEGER PRIMARY KEY AUTOINCREMENT),否则后续删除会出错
删除按钮点击没反应,控制台也没报错?
这是典型“没发请求”问题。HTML 按钮默认是 type="submit",但如果你没包在 form 里,或者没指定 formaction,它根本不会触发任何 HTTP 请求。
立即学习“Python免费学习笔记(深入)”;
- 最简方案:每个删除按钮单独用一个
form包裹,method="POST",action="/delete",并带隐藏字段<input type="hidden" name="task_id" value="{{ task.id }}"> - 不要用
<button onclick="location.href='/delete?id=1'"></button>—— GET 删除违反 REST 原则,且容易被爬虫误触发 - 后端
/delete路由必须检查request.method == 'POST'并从request.form['task_id']取值,别用request.args
真正卡住人的往往不是逻辑,而是表单 method 和路由 method 不匹配、重定向漏写、或者 SQLite 文件路径写成相对路径导致每次重启都新建空库——这些细节比写功能代码更花时间定位。

















