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

