Flask 应用未注册 jwt.user_lookup_loader,Flask-JWT-Extended
Flask app doen't register jwt.user_lookup_loader, Flask-JWT-Extended
我有一个带有蓝图的 Flask 应用程序。它工作得很好,但我决定使用 flask_jwt_extended
来处理令牌。在文档中说我可以用 jwt.user_lookup_loader
修饰方法以使 current_user
工作。但由于某种原因调用 current_user
以错误结束:
You must provide a `@jwt.user_lookup_loader` callback to use this method
但它就在那里,在同一个蓝图中。还有一种方法,用 @jwt.user_identity_loader
装饰,效果很好。
这是我的代码的简化版本:
from . import rpc, jwt
from flask_jwt_extended import current_user, jwt_required
bp = Blueprint('login_bp', __name__)
@jwt.user_identity_loader
def _user_identity_lookup(user):
return user.id
@jwt.user_lookup_loader
def _user_lookup_callback(_jwt_header, jwt_data):
identity = jwt_data["sub"]
user = rpc.cache_service.get_user(identity)
if user is None:
return None
return UserSchema().load(user)
@jwt_required()
@bp.route("/logout", methods=['POST'])
def logout():
rpc.cache_service.forget_user(current_user.id)
return {"status": "OK"}
jwt 这里是 JWTManager,用我的应用初始化:
jwt = JWTManager()
def create_app():
app = Flask(__name__, instance_relative_config=False)
app.config.from_mapping(JWT_SECRET_KEY=os.environ["JWT_SECRET_KEY"])
...
jwt.init_app(app)
...
with app.app_context():
from . import login_bp
app.register_blueprint(login_bp.bp)
这段代码基本上来自文档示例:
https://flask-jwt-extended.readthedocs.io/en/stable/automatic_user_loading/
我看不出问题出在哪里 (
Link 到回购:
https://github.com/GreenBlackSky/COIN/blob/master/api_app/app/login_bp.py
你的装饰器顺序错误。 @bp.route()
需要在 @jwt_required()
之前,否则它会在请求进入时尝试评估 logout
方法,然后再解码请求中的 JWT。
我有一个带有蓝图的 Flask 应用程序。它工作得很好,但我决定使用 flask_jwt_extended
来处理令牌。在文档中说我可以用 jwt.user_lookup_loader
修饰方法以使 current_user
工作。但由于某种原因调用 current_user
以错误结束:
You must provide a `@jwt.user_lookup_loader` callback to use this method
但它就在那里,在同一个蓝图中。还有一种方法,用 @jwt.user_identity_loader
装饰,效果很好。
这是我的代码的简化版本:
from . import rpc, jwt
from flask_jwt_extended import current_user, jwt_required
bp = Blueprint('login_bp', __name__)
@jwt.user_identity_loader
def _user_identity_lookup(user):
return user.id
@jwt.user_lookup_loader
def _user_lookup_callback(_jwt_header, jwt_data):
identity = jwt_data["sub"]
user = rpc.cache_service.get_user(identity)
if user is None:
return None
return UserSchema().load(user)
@jwt_required()
@bp.route("/logout", methods=['POST'])
def logout():
rpc.cache_service.forget_user(current_user.id)
return {"status": "OK"}
jwt 这里是 JWTManager,用我的应用初始化:
jwt = JWTManager()
def create_app():
app = Flask(__name__, instance_relative_config=False)
app.config.from_mapping(JWT_SECRET_KEY=os.environ["JWT_SECRET_KEY"])
...
jwt.init_app(app)
...
with app.app_context():
from . import login_bp
app.register_blueprint(login_bp.bp)
这段代码基本上来自文档示例:
https://flask-jwt-extended.readthedocs.io/en/stable/automatic_user_loading/
我看不出问题出在哪里 (
Link 到回购: https://github.com/GreenBlackSky/COIN/blob/master/api_app/app/login_bp.py
你的装饰器顺序错误。 @bp.route()
需要在 @jwt_required()
之前,否则它会在请求进入时尝试评估 logout
方法,然后再解码请求中的 JWT。