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

Flask应用中如何调用一个Blueprint中定义的自定义装饰器到另一个Blueprint

跨蓝图调用自定义装饰器修复方案

问题根源

你出现报错的核心原因有三个:

  1. 导入路径错误:token_required 定义在Blueprintone.py中,但你在Blueprinttwo.py中写的是from blueprinttwo import token_required,导入了错误的模块,自然找不到目标装饰器。
  2. 依赖缺失:Blueprintone.py中的装饰器使用了@wraps(f)语法,但没有提前导入functools.wraps,就算导入路径正确也会运行报错。
  3. 装饰器顺序错误:你把@token_required放在了路由装饰器@desktop_demo.route的上方,会导致路由注册的是未被装饰的原始函数,token校验逻辑不会生效。

具体修复步骤

1. 修复Blueprintone.py的依赖与返回值

补全缺失的导入,同时建议使用Flask自带的jsonify返回响应,自动设置正确的Content-Type响应头:

from flask import jsonify, Blueprint, current_app, request
import pyodbc
import logging
from functools import wraps # 补上wraps依赖导入

authenticate = Blueprint('authenticate', __name__)

# 自定义token校验函数
def validateToken(token):
    return token+"true"
    
def token_required(f):
    @wraps(f)
    def decorator(*args, **kwargs):
        token = None
        if 'x-access-tokens' in request.headers:
            token = request.headers['x-access-tokens']
            print(token)

        if not token:
            print("Access token is not pass")
            return jsonify({'message': 'a valid token is missing'}), 401

        try:
            current_user="true"
            # 后续可接入JWT解码、用户查询逻辑
        except:
            return jsonify({'message': 'token is invalid'}), 401

        return f(*args, **kwargs)
    return decorator

2. 修复Blueprinttwo.py的导入与装饰器顺序

修正导入路径,调整装饰器顺序(路由装饰器放在最外层,自定义装饰器靠近函数定义):

from flask import json, Blueprint, current_app,request, jsonify
import pyodbc
from collections import OrderedDict
from datetime import datetime, date, timedelta
import collections
import logging
# 修正导入路径,从Blueprintone模块导入装饰器
from Blueprintone import token_required

desktop_demo = Blueprint('desktop_demo', __name__)

# 装饰器顺序:先写路由装饰器,再写自定义校验装饰器
@desktop_demo.route('/demo/<obj_list>/<user_id>/<session_id>', defaults={'user_id': None, 'session_id': None}, methods = ['GET'])
@token_required
def demoStory(obj_list,user_id,session_id):
    return jsonify({'status': 'success'})

可选优化方案

如果项目规模较大,建议把通用的工具类装饰器单独抽离到公共模块,比如新建utils/decorators.py文件存放token_required等通用装饰器,所有蓝图都直接从公共工具模块导入即可,不需要绑定在某个蓝图下,避免跨蓝图导入的依赖耦合问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:39:03