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

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

修复说明

  1. 返回函数对象而非调用函数:将return decorated_function()改为return decorated_function,确保装饰器绑定的是函数本身,而不是在定义阶段就执行函数(此时无请求上下文)。
  2. 正确使用wraps装饰器:添加@符号使@wraps(f)生效,避免Flask路由因函数元信息丢失出现异常。
  3. 移除重复验证逻辑:装饰器内部已包含@jwt_required(),接口层无需重复添加,减少冗余代码。

内容的提问来源于stack exchange,提问作者cipisek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:40:56