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
相关产品推荐
相关产品推荐

