Flask 无法跳转到对应功能页面:根本原因与完整解决方案

你的 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' 等)。

⚠️ 重要补充建议

  1. 启用调试模式(已在答案中强调):

    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=8000, debug=True)  # ✅ 添加 debug=True

    启用后,错误会显示详细堆栈,极大提升排错效率。

  2. HTML 模板命名需与路由一致
    确保你提供的 HTML 文件保存为:
    vytvorit_denik.html, ulozit_denik.html, nacist_denik.html, ..., smazat_cely_denik.html
    并置于 templates/ 目录下(Flask 默认查找路径)。

  3. 避免全局变量状态风险(进阶提醒)
    deniky = {} 是内存字典,应用重启即丢失。若需持久化,请后续接入 SQLite 或文件存储 —— 但当前紧急交付,内存方案可接受。

  4. 安全增强(可选)
    所有 request.form.get(...) 建议加空值检查,防止 KeyError:

    nazev_deniku = request.form.get('nazev_deniku', '').strip()
    if not nazev_deniku:
        return redirect(url_for('index'))

完成以上两处关键修改(动态分发 + 独立模板渲染),你的应用将立即响应用户选择,流畅跳转至对应功能页。祝你顺利通过教授验收!