You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask项目删除锦标赛功能触发404错误,求解决方案

Flask删除锦标赛功能触发404错误的排查与解决

问题重现

使用Flask开发网站时,实现删除锦标赛功能后,触发操作出现404 Not Found错误。相关代码如下:

前端表单代码

<form action="/delete_tournament/{{ tournament['tournament_id'] }}" method="post" style="margin-top: 10px;">
  <input id="guest-button" type="button" name="answer" value="delete tournament" style="background: darkslateblue; border-color: white;">
</form>

后端路由处理代码

@app.route('/delete_tournament/<int:tournament_id>', methods=["POST", "GET"])
@login_required
def delete_tournament(tournament_id):
    db_sess = db_session.create_session()
    tournament = db_sess.query(Tournament).filter(Tournament.id == tournament_id).first()
    if tournament:
        db_sess.delete(tournament)
        if tournament_id in current_user.tournament_list:
            current_user.delete_tournament(tournament_id)
        for proposal in db_sess.query(Proposal).filter(Proposal.tournament_id == tournament_id).all():
            for participant_id in proposal.participants_list:
                participant = get_participant(participant_id)
                db_sess.delete(participant)
            user = db_sess.query(User).filter(User.id == proposal.team_id).first()
            user.delete_proposal(proposal.id)
            db_sess.delete(proposal)
        db_sess.commit()
    else:
        abort(404)
    return redirect('/')

排查与解决步骤

1. 修复表单提交按钮

前端按钮使用type="button"时,不会触发表单的提交动作,点击按钮后没有任何请求发送到后端路由,这是最可能的直接原因。将按钮类型改为type="submit":

<form action="/delete_tournament/{{ tournament['tournament_id'] }}" method="post" style="margin-top: 10px;">
  <input id="guest-button" type="submit" name="answer" value="delete tournament" style="background: darkslateblue; border-color: white;">
</form>

2. 验证前端生成的URL有效性

通过浏览器开发者工具查看渲染后的表单action属性,确认生成的URL格式正确(例如/delete_tournament/12),且其中的ID为有效整数:

  • 检查tournament['tournament_id']是否与后端Tournament表的id字段对应,避免字段名不匹配导致生成错误ID。
  • 如果URL中的ID不存在于数据库,后端会触发abort(404),需确认该ID对应的锦标赛确实存在。

3. 检查路由匹配与权限

  • 确认@login_required装饰器未导致异常重定向(例如未登录时重定向到错误页面),确保操作时用户处于已登录状态。
  • 排查Flask应用中是否存在其他路由与/delete_tournament/<int:tournament_id>的URL模式冲突,避免路由被覆盖。

4. 添加调试日志定位问题

在后端函数中添加日志,确认请求是否到达路由,以及锦标赛是否存在:

import logging
logging.basicConfig(level=logging.INFO)

@app.route('/delete_tournament/<int:tournament_id>', methods=["POST", "GET"])
@login_required
def delete_tournament(tournament_id):
    logging.info(f"请求删除锦标赛ID: {tournament_id}")
    db_sess = db_session.create_session()
    tournament = db_sess.query(Tournament).filter(Tournament.id == tournament_id).first()
    logging.info(f"查询到锦标赛: {tournament}")
    # 原有业务代码保持不变

如果日志中无请求记录,说明请求未到达路由,需检查前端提交逻辑或路由注册情况。

内容的提问来源于stack exchange,提问作者mizu fx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:00:10