Flask出现RuntimeError:未设置密钥致会话不可用,求解决方案
你的代码存在几个关键问题导致了该错误,下面逐一说明并给出修正方案:
问题1:未将Blueprint注册到Flask应用实例
你创建了login_bp蓝图,但未将其注册到主Flask应用app上。Session功能依附于Flask主应用,未注册蓝图会导致session相关配置无法被正确加载,进而触发密钥未设置的错误。
解决方法:在代码末尾添加蓝图注册代码:
app.register_blueprint(login_bp)
问题2:token_required装饰器中的配置引用错误
装饰器里写了login.config['SECRET_KEY'],但你的蓝图对象名为login_bp,不存在login这个变量,这会导致JWT解码出错,同时也间接影响session的配置识别。
解决方法:将装饰器中的login.config改为app.config(更推荐,因为主应用已配置密钥):
payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
问题3:冗余的Blueprint配置
你给login_bp单独设置了SECRET_KEY,但Blueprint会自动继承主应用的配置,重复设置不仅没必要,还可能导致配置混乱。
解决方法:删除以下两行冗余代码:
login_bp.config = {} login_bp.config['SECRET_KEY'] = 'g}/lVKCOmv)kvhWBNV;+}_}.eJ(]n`Y:d,O|q44lgMIHeHp|G;27>KS2,ynEDhJ'
修正后的完整代码
# flask imports from flask import Flask, request, jsonify, make_response, render_template, session, Blueprint import jwt from datetime import datetime, timedelta from functools import wraps from db.models.account import Accounts from db.models.teachers import Teacher import db from db.models import db login_bp = Blueprint('login', __name__) # creates Flask object app = Flask(__name__) app.config['SECRET_KEY'] = 'g}/lVKCOmv)kvhWBNV;+}_}.eJ(]n`Y:d,O|q44lgMIHeHp|G;27>KS2,ynEDhJ' app.config['SESSION_TYPE'] = 'filesystem' def token_required(func): @wraps(func) def decorator(*args, **kwargs): token = request.args.get('token') if not token: return jsonify({'Alert': 'Token is missing'}) try: # 使用主应用的SECRET_KEY解码,显式指定算法避免兼容问题 payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"]) except Exception as e: return jsonify({'Alert': str(e)}) # 调用原视图函数,否则装饰器会拦截请求不返回原内容 return func(*args, **kwargs) return decorator @login_bp.route('/login', methods=['POST']) def handle_login(): if Accounts.check_exists_account(request): #处理邮箱和密码是否存在于数据库 session['logged_in'] = True token = jwt.encode({ 'user': request.form['email'], 'expiration': str(datetime.utcnow() + timedelta(seconds=120)) }, app.config['SECRET_KEY'], algorithm="HS256") return jsonify({'token': token.decode('utf-8')}) else: return make_response('Unable to verify' ,403,{'WWW-Authenticate': 'Basic realm: Authentication Failed'}) @login_bp.route('/auth') @token_required def auth(): return 'JWT is verified. Welcome to your dashboard ! ' # 注册蓝图到主应用 app.register_blueprint(login_bp) # 添加运行入口(直接运行该文件时生效) if __name__ == '__main__': app.run(debug=True)
额外提示:
- 使用
jwt.encode和jwt.decode时显式指定算法(如HS256),可避免版本兼容警告或错误。 - 原
token_required装饰器未调用原视图函数,会导致访问/auth时无法返回预期内容,修正后的代码已补上该逻辑。
内容的提问来源于stack exchange,提问作者Hoàng Minh Đức
相关产品推荐
相关产品推荐

