如何解决树莓派Flask应用出现的Unauthorized未授权登录错误?
问题原因定位
两个报错均为代码逻辑缺失导致:
- TypeError报错根因
你编写的login视图函数中,POST请求下用户名密码验证失败的分支,仅执行了flash("Invalid username or password."),没有返回任何合法响应。Flask强制要求所有视图函数必须返回响应对象,该分支无返回值就触发了此报错。 - Unauthorized报错根因
代码中登录成功后跳转的目标是url_for("user", username=username),但你贴出的代码里完全没有定义对应user别名的视图函数。如果这个user视图已经额外编写且加了@login_required装饰器,还需要进一步排查session写入、签名验证逻辑是否正常。
修复方案
第一步:修复login视图的返回逻辑
在验证失败的分支补充返回登录页的逻辑,修改后的login函数代码如下:
@app.route("/", methods = ["GET", "POST"]) @app.route("/login/", methods=["GET", "POST"]) def login(): if request.method == "POST": username = request.form['username'] password = request.form['password'] if not (username and password): flash("Username or Password cannot be empty.") return redirect(url_for('login')) else: username = username.strip() password = password.strip() user = User.query.filter_by(username=username).first() if user and check_password_hash(user.password_hashed, password): session['logged_in'] = True # 建议额外把用户名存入session,方便后续业务逻辑取用户信息 session['username'] = username return redirect(url_for("user", username=username)) else: flash("Invalid username or password.") # 新增下面这行返回逻辑即可解决TypeError报错 return redirect(url_for('login')) else: return render_template("login.html")
第二步:补充/检查user视图函数
确保你已经编写了对应别名的user视图,示例参考实现如下:
@app.route("/user/<username>") @login_required def user(username): # 此处补充你自己的LED控制页面逻辑即可 return render_template("user.html", username=username)
额外排查项
如果完成上述修改后仍报Unauthorized,按顺序排查:
- 确认测试用的账号是通过signup接口正常写入数据库的,没有手动修改过库内的密码哈希值
- 检查树莓派的系统时间是否正常,时间偏差过大会导致session签名验证失败,清理浏览器缓存后重试即可
- 确认代码中的
SECRET_KEY没有被篡改,固定的SECRET_KEY修改后会导致历史session全部失效
内容的提问来源于stack exchange,提问作者Mysterion
相关产品推荐
相关产品推荐

