
你的 flask 应用在用户提交表单后始终卡在首页,根本原因在于 index 路由未处理表单中的操作选择(如“创建日记”),而是无条件重定向回自身;所有功能路由也缺乏对 get 请求的正确响应逻辑,导致流程中断。
你的 flask 应用在用户提交表单后始终卡在首页,根本原因在于 index 路由未处理表单中的操作选择(如“创建日记”),而是无条件重定向回自身;所有功能路由也缺乏对 get 请求的正确响应逻辑,导致流程中断。
问题核心非常明确:当前的 index() 视图函数仅区分了请求方法(GET/POST),但完全忽略了表单提交的实际意图。你在 HTML 中定义的
✅ 正确做法:让 index 处理表单分发逻辑
你需要修改 index() 函数,使其在收到 POST 请求时解析用户选择,并主动重定向至对应功能路由:
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
return render_template('index.html', deniky=deniky)
elif request.method == 'POST':
# 关键修复:读取用户选择的操作
moznost = request.form.get('moznost')
if not moznost:
return redirect(url_for('index')) # 防御性处理
# 根据选择分发到对应路由(注意:URL 规则需与 @app.route 定义一致)
if moznost == 'vytvorit_denik':
return redirect(url_for('vytvorit_denik'))
elif moznost == 'ulozit_denik':
return redirect(url_for('ulozit_denik'))
elif moznost == 'nacist_denik':
return redirect(url_for('nacist_denik'))
elif moznost == 'vlozit_zaznam':
return redirect(url_for('vlozit_zaznam'))
elif moznost == 'vyhledat_zaznam':
return redirect(url_for('vyhledat_zaznam'))
elif moznost == 'smazat_zaznam':
return redirect(url_for('smazat_zaznam'))
elif moznost == 'smazat_vsechny_zaznamy':
return redirect(url_for('smazat_vsechny_zaznamy'))
elif moznost == 'smazat_cely_denik':
return redirect(url_for('smazat_cely_denik'))
else:
# 未知选项,返回首页并可加 flash 提示(需配置 session)
return redirect(url_for('index'))
⚠️ 注意:确保你已启用 Flask 的 session 支持(用于 flash()),若暂不使用,至少添加 else 分支避免 500 错误。
? 同时优化各功能路由的 GET 响应
目前所有功能路由(如 /vytvorit_denik)在 GET 请求时都渲染 index.html,这不符合用户体验预期。应改为渲染各自专属的 HTML 模板(你已提供多个独立 HTML 文件),例如:
@app.route('/vytvorit_denik', methods=['GET', 'POST'])
def vytvorit_denik():
if request.method == 'GET':
return render_template('vytvorit_denik.html') # ✅ 使用专用模板
elif request.method == 'POST':
nazev_deniku = request.form['nazev_deniku']
if nazev_deniku and nazev_deniku not in deniky:
deniky[nazev_deniku] = []
return redirect(url_for('index'))
请为其他路由(ulozit_denik, nacist_denik, …)同步更新 render_template(...) 的模板名,匹配你提供的 HTML 文件名(如 ulozit_denik.html, nacist_denik.html 等)。这是保证界面跳转流畅的关键一步。
?️ 其他关键建议(提升稳定性与调试效率)
-
启用调试模式:将 app.run(...) 改为
if __name__ == '__main__': app.run(host="0.0.0.0", port=8000, debug=True) # ✅ 开启 debug=True这样出错时会显示详细堆栈和交互式调试器,极大缩短排查时间。
验证模板路径:确认所有 .html 文件均放在 templates/ 目录下(Flask 默认查找路径),且文件名与 render_template('xxx.html') 中的参数完全一致(含大小写)。
-
表单 action 属性一致性:检查所有子页面 HTML 中的
避免全局变量风险(进阶提醒):deniky = {} 是内存字典,多用户或重启后数据丢失。课程项目可接受,但务必在报告中注明此限制;若需持久化,后续应迁移到 SQLite 或 JSON 文件。
完成以上三步(分发逻辑 + 模板分离 + 调试启用),你的应用将立即恢复正常导航:选择“创建日记” → 跳转到创建页面 → 提交 → 返回首页 → 再选“插入记录” → 跳转对应页……整个流程闭环可控。
现在就去修改 index() 函数和各路由的 render_template() 调用吧——这是你交作业前最关键的两处改动。祝顺利通过答辩!











