
你的 flask 应用始终停留在首页,是因为所有表单都提交到 `/`(即 `index` 路由),而该路由的 post 处理逻辑仅执行 `redirect(url_for('index'))`,形成死循环;同时各功能路由未在 get 请求时渲染专属页面,导致用户操作后无响应。
问题核心在于 前端表单提交目标与后端路由逻辑严重脱节。当前 index.html 中的主选择表单:
它将用户选择(如 "vytvorit_denik")作为 moznost 字段以 POST 方式发送至 /。但你的 index() 函数对 POST 请求完全忽略该字段,直接重定向回自身:
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
return redirect(url_for('index')) # ❌ 关键错误:不解析 moznost,也不跳转到对应功能这导致无论用户选什么,都“卡”在首页 —— 表单提交 → 进入 index() POST 分支 → 立即重定向回 index → 渲染 index.html → 循环开始。
✅ 正确做法:让首页 POST 动态分发请求
修改 index() 的 POST 处理逻辑,根据 moznost 值重定向至对应功能路由:
@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')
# 映射选项值到对应路由端点
route_map = {
'vytvorit_denik': 'vytvorit_denik',
'ulozit_denik': 'ulozit_denik',
'nacist_denik': 'nacist_denik',
'vlozit_zaznam': 'vlozit_zaznam',
'vyhledat_zaznam': 'vyhledat_zaznam',
'smazat_zaznam': 'smazat_zaznam',
'smazat_vsechny_zaznamy': 'smazat_vsechny_zaznamy',
'smazat_cely_denik': 'smazat_cely_denik'
}
if moznost in route_map:
return redirect(url_for(route_map[moznost]))
else:
# 可选:返回错误提示或默认跳转
return redirect(url_for('index'))✅ 同时修复各功能路由的 GET 响应
你当前所有功能路由(如 /vytvorit_denik)在 GET 请求时仍渲染 index.html,这违背用户预期。应为每个功能提供独立的 HTML 模板(你已提供多个 HTML 文件,只需正确关联):
- ✅ 将 vytvorit_denik.html 用于 vytvorit_denik 路由
- ✅ 将 ulozit_denik.html 用于 ulozit_denik 路由
- …以此类推
例如,修正 vytvorit_denik():
@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 请求 → 渲染专属页面
return render_template('vytvorit_denik.html') # ✅ 使用对应模板其他路由同理替换 render_template('index.html', ...) 为各自模板(如 'nacist_denik.html', 'vlozit_zaznam.html' 等)。
⚠️ 重要补充建议
-
启用调试模式(已在答案中强调):
if __name__ == '__main__': app.run(host="0.0.0.0", port=8000, debug=True) # ✅ 添加 debug=True启用后,错误会显示详细堆栈,极大提升排错效率。
HTML 模板命名需与路由一致:
确保你提供的 HTML 文件保存为:
vytvorit_denik.html, ulozit_denik.html, nacist_denik.html, ..., smazat_cely_denik.html
并置于 templates/ 目录下(Flask 默认查找路径)。避免全局变量状态风险(进阶提醒):
deniky = {} 是内存字典,应用重启即丢失。若需持久化,请后续接入 SQLite 或文件存储 —— 但当前紧急交付,内存方案可接受。-
安全增强(可选):
所有 request.form.get(...) 建议加空值检查,防止 KeyError:nazev_deniku = request.form.get('nazev_deniku', '').strip() if not nazev_deniku: return redirect(url_for('index'))
完成以上两处关键修改(动态分发 + 独立模板渲染),你的应用将立即响应用户选择,流畅跳转至对应功能页。祝你顺利通过教授验收!










