Flask API自定义admin_required装饰器报错:应用上下文外工作
Flask装饰器报错:Working outside of application context 解决方法
错误根源
你的代码存在三个关键问题,直接触发了上下文错误:
- 装饰器最后返回的是
decorated_function(),这会在路由定义阶段直接执行函数,此时还未生成请求上下文,因此抛出RuntimeError: Working outside of application context @wraps(f)缺少前置的@符号,无法正确保留原函数的元信息- 接口同时使用
@jwt_required()和装饰器内的@jwt_required(),重复执行JWT验证逻辑
修复后的代码
管理员验证装饰器
from functools import wraps from flask_jwt_extended import jwt_required, get_jwt_identity from flask import jsonify def admin_required(f): @wraps(f) # 正确应用wraps装饰器,保留原函数元信息 @jwt_required() def decorated_function(*args, **kwargs): current_user = get_jwt_identity() if current_user != "test1": return jsonify(admin=False), 200 return f(*args, **kwargs) return decorated_function # 返回函数对象,而非调用函数
接口路由
@app.route("/am_i_admin", methods=["GET"]) @admin_required # 无需重复添加@jwt_required() def am_i_admin(): return jsonify(admin=True), 200
修复说明
- 返回函数对象而非调用函数:将
return decorated_function()改为return decorated_function,确保装饰器绑定的是函数本身,而不是在定义阶段就执行函数(此时无请求上下文)。 - 正确使用wraps装饰器:添加
@符号使@wraps(f)生效,避免Flask路由因函数元信息丢失出现异常。 - 移除重复验证逻辑:装饰器内部已包含
@jwt_required(),接口层无需重复添加,减少冗余代码。
内容的提问来源于stack exchange,提问作者cipisek
相关产品推荐
相关产品推荐

