
你的 Flask 应用始终停留在首页,是因为所有表单提交都发往 /(即 index 路由),而该路由的 POST 处理逻辑仅执行 redirect(url_for('index')),形成死循环;同时各功能路由未在 GET 时渲染专属页面,导致用户操作无响应。
你的 flask 应用始终停留在首页,是因为所有表单提交都发往 `/`(即 `index` 路由),而该路由的 post 处理逻辑仅执行 `redirect(url_for('index'))`,形成死循环;同时各功能路由未在 get 时渲染专属页面,导致用户操作无响应。
问题核心在于 前端路由选择与后端处理逻辑严重脱节。当前 index.html 中的主表单使用了 <form action="/" method="POST">,无论用户选择哪个选项(如“Vytvořit deník”),请求都会被发送至 /,触发 index() 视图函数——而它对 POST 请求的唯一响应就是重定向回自身,造成“卡在首页”的假象。
要真正解决,需完成两层重构:
✅ 第一步:修改首页表单,按选项动态提交至对应路由
将 index.html 中的静态表单改为 JavaScript 驱动的动态提交,根据用户选择跳转到不同 endpoint:
<!-- 替换原 index.html 中的 form -->
<form id="main-form" onsubmit="handleSubmit(event)">
<label for="moznost">Vyberte možnost:</label>
<select id="moznost" name="moznost">
<option value="">— Vyberte akci —</option>
<option value="/vytvorit_denik">Vytvořit deník</option>
<option value="/ulozit_denik">Uložit deník do souboru</option>
<option value="/nacist_denik">Načíst deník ze souboru</option>
<option value="/vlozit_zaznam">Vložit záznam</option>
<option value="/vyhledat_zaznam">Vyhledat záznam</option>
<option value="/smazat_zaznam">Smazat záznam</option>
<option value="/smazat_vsechny_zaznamy">Smazat všechny záznamy</option>
<option value="/smazat_cely_denik">Smazat celý deník</option>
</select>
<br>
<button type="submit">Potvrdit</button>
</form>
<script>
function handleSubmit(event) {
event.preventDefault();
const selected = document.getElementById('moznost').value;
if (selected) {
window.location.href = selected;
}
}
</script>⚠️ 注意:不要使用 <form method="POST"> 直接提交,因为多数功能页(如 /vytvorit_denik)在 GET 时需展示表单,而非接收 POST 数据。直接跳转更符合语义且避免 CSRF 混乱。
✅ 第二步:确保每个功能路由在 GET 时返回正确模板
你现有的各路由(如 /vytvorit_denik)在 request.method == 'GET' 时已返回对应 HTML,但存在关键疏漏:它们全部调用了 render_template('index.html', ...),导致无论访问哪个 URL,最终都渲染首页!
请立即修正所有功能路由的 GET 分支,使其返回各自专属模板:
@app.route('/vytvorit_denik', methods=['GET', 'POST'])
def vytvorit_denik():
if request.method == 'POST':
nazev_deniku = request.form['nazev_deniku']
if nazev_deniku not in deniky:
deniky[nazev_deniku] = []
return redirect(url_for('index'))
else: # GET → 渲染专用页面,非 index.html!
return render_template('vytvorit_denik.html', deniky=deniky)
@app.route('/ulozit_denik', methods=['GET', 'POST'])
def ulozit_denik():
if request.method == 'POST':
nazev_deniku = request.form['nazev_deniku']
obsah_deniku = deniky.get(nazev_deniku)
if obsah_deniku:
with open(f'{nazev_deniku}.txt', 'w') as file:
file.write('\n'.join(str(z) for z in obsah_deniku)) # 修复:序列化字典
return redirect(url_for('index'))
else:
return render_template('ulozit_denik.html', deniky=deniky)
# 其他路由同理:GET 返回对应 .html 模板,如 'nacist_denik.html'、'vlozit_zaznam.html' 等✅ 第三步:启用调试模式并验证日志
启动服务时务必开启 debug=True,便于捕获隐式错误(如模板缺失、变量未定义):
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000, debug=True) # ← 关键!此时若访问 /vytvorit_denik,Flask 将在控制台明确提示:
jinja2.exceptions.TemplateNotFound: vytvorit_denik.html
这正是你需要的线索——立即创建对应 HTML 文件(内容即你提供的 vytvorit_denik.html 片段),并确保文件名与 render_template() 中一致。
? 总结与交付建议
- ✅ 根本原因:首页表单提交目标错误 + 所有路由 GET 均返回 index.html → 用户永远看不到功能页。
- ✅ 修复要点:① 用 JS 动态跳转替代 POST 提交;② 每个路由 GET 分支返回专属模板;③ 启用 debug=True 快速定位模板/逻辑错误。
- ✅ 紧急交付检查清单:
- 所有 .html 文件已放入 templates/ 目录,命名与 render_template() 严格一致;
- index.html 已替换为含 JS 跳转的版本;
- 启动命令含 debug=True;
- 浏览器访问 http://localhost:8000/vytvorit_denik 应直接显示创建日记本表单。
按此方案调整后,你的应用将在数分钟内恢复正常交互流程,顺利通过教授验收。


















