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

Flask出现RuntimeError:未设置密钥致会话不可用,求解决方案

解决Flask RuntimeError: The session is unavailable because no secret key was set问题

你的代码存在几个关键问题导致了该错误,下面逐一说明并给出修正方案:

问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:45:00