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

Flask开发宝可梦初始精灵性格测试应用提交后跳转错误排查

问题根因与修复方案

1. 核心错误:使用全局变量存储用户独立计数

你当前定义的bs/sq/ch三个全局变量是所有访问用户共享的,会引发两个直接导致异常的问题:

  • 多个用户同时答题时,计数会交叉累加混乱
  • 单个用户第二次答题时,上一次的计数没有清零,直接叠加后极易出现两个变量数值相等的情况,触发你的else分支返回apology

另外你最后启动代码写的是flaskapp.run(),但前面实例化Flask对象用的是app = Flask(__name__),变量名不一致会直接导致启动报错。

2. 次要错误:结果判断逻辑覆盖不全

你当前的判断逻辑只覆盖了「某一个变量严格大于另外两个」的场景,只要出现任意两个变量数值相等(比如ch=2, bs=2, sq=1),就会走到apology分支,完全没有处理平票场景。


具体修复步骤

步骤1:替换全局变量为session存储用户独立计数

Flask的session可以为每个用户独立存储数据,天然隔离不同用户的答题进度,还可以方便重置计数:
首先要给app设置secret_key,session才能正常工作:

app = Flask(__name__)
app.config["TEMPLATES_AUTO_RELOAD"] = True
# 新增:设置session加密密钥,可自定义任意字符串
app.secret_key = "pokemon_test_123456"

然后在用户进入第一题的时候初始化当前用户的计数:

@app.route("/question1" ,methods=["GET", "POST"])
def question1():
    if request.method == "GET":
        # 初始化当前用户的三个计数为0
        session["bs"] = 0
        session["sq"] = 0
        session["ch"] = 0
        return render_template("question1.html")
    return redirect ("question1/send")

把所有答题提交路由里的全局变量操作改成session操作,以question1_send为例:

@app.route("/question1/send", methods=["GET", "POST"])
def question1_send():
    # 不需要再声明global
    answer1 = request.form["answer1"]
    if not answer1:
        return apology("You have to choose an answer!", 403)
    else:
        if answer1 == "bs1":
            session["bs"] += 1
        elif answer1 == "sq1":
            session["sq"] += 1
        elif answer1 == "ch1":
            session["ch"] += 1
        return redirect("question2")

其余question2-5的send路由按上述逻辑统一修改即可。

步骤2:修复结果路由的判断逻辑

补充平票场景的处理规则,同时从session中读取计数:

@app.route("/results", methods=["GET", "POST"])
def starter_pokemon():
    ch = session.get("ch", 0)
    bs = session.get("bs", 0)
    sq = session.get("sq", 0)
    if ch > bs and ch > sq:
        return render_template("charizard.html")
    elif bs > ch and bs > sq:
        return render_template("bulbasaur.html")
    elif sq > ch and sq > bs:
        return render_template("squirtle.html")
    # 新增平票处理逻辑:多个最高值时可按自定义优先级返回,也可随机返回
    else:
        max_val = max(ch, bs, sq)
        if ch == max_val:
            return render_template("charizard.html")
        elif bs == max_val:
            return render_template("bulbasaur.html")
        else:
            return render_template("squirtle.html")

步骤3:修复启动代码的变量名错误

把启动部分的代码修改为:

if __name__ == "__main__":
    app.run()

内容的提问来源于stack exchange,提问作者leonard.richertz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:36:03