
当从/key通过redirect("/goPlay")跳转时出现“Method Not Allowed”,根本原因是/goPlay路由仅声明支持POST,而重定向触发的是GET请求,需显式添加'GET'到methods列表。
当从`/key`通过`redirect("/goplay")`跳转时出现“method not allowed”,根本原因是`/goplay`路由仅声明支持`post`,而重定向触发的是`get`请求,需显式添加`'get'`到`methods`列表。
在 Flask 中,redirect() 默认发起 HTTP GET 请求。你当前的 /goPlay 路由定义为:
@app.route('/goPlay', methods=['POST'])
def goPlay():
# ...
这意味着该端点只接受 POST 请求,任何 GET 请求(包括 redirect("/goPlay") 产生的)都会被 Flask 拒绝,并返回 405 Method Not Allowed 错误。
✅ 正确做法是:明确允许 GET 方法,使路由能响应重定向请求:
@app.route('/goPlay', methods=['GET', 'POST'])
def goPlay():
# 处理 GET 请求(如重定向进入、页面刷新)
if request.method == 'GET':
# 可选择渲染初始游戏页,或重定向回主页(避免空状态)
# 示例:检查 session 或 game 数据是否就绪
if 'playerName' not in session:
return redirect('/')
return render_template('goPlay.html', theGame=session.get('current_game'))
# 原有 POST 逻辑保持不变(如表单提交处理)
if request.method == 'POST':
# ... 你的原有逻辑(获取 playerName/language、生成单词等)
thisGame = Game(
playerName=request.form.get('playerName', 'Guest'),
theWord='',
theLanguage=request.form.get('language', 'en'),
theGuessedWord='',
guessCount=0,
maxGuessCount=8,
wrongGuessCount=0,
gamesPlayed=0,
gamesWon=0,
newGame=True,
keyPressed=''
)
# ... 后续初始化逻辑(pickWord, translateWord 等)
session['current_game'] = thisGame.__dict__ # 简化存储(实际建议用更健壮方式)
return render_template('goPlay.html', theGame=thisGame)
⚠️ 注意事项:
- 不要在 GET 分支中直接访问 request.form —— 它在 GET 请求中为空,会导致 KeyError。
- 若 /goPlay 主要用于展示已初始化的游戏状态(而非接收新表单),建议将「创建游戏」逻辑保留在 /goPlay 的 POST 处理中,而 GET 仅用于安全地渲染已有游戏上下文(例如从 session 恢复)。
- 你当前代码中 thisGame=game 是类引用而非实例,应改为 thisGame = game(...);同时 key 未定义(self.keyPressed = key 报错),需修正构造函数逻辑。
- 推荐使用 session 或 g 对象跨请求传递游戏状态,而非依赖未持久化的局部对象。
? 总结:Flask 路由的 methods 参数必须精确匹配客户端请求类型。重定向 → GET → 路由必须含 'GET';表单提交 → POST → 路由必须含 'POST'。二者可共存,但不可省略其一。










