Flask应用中如何调用一个Blueprint中定义的自定义装饰器到另一个Blueprint
跨蓝图调用自定义装饰器修复方案
问题根源
你出现报错的核心原因有三个:
- 导入路径错误:
token_required定义在Blueprintone.py中,但你在Blueprinttwo.py中写的是from blueprinttwo import token_required,导入了错误的模块,自然找不到目标装饰器。 - 依赖缺失:
Blueprintone.py中的装饰器使用了@wraps(f)语法,但没有提前导入functools.wraps,就算导入路径正确也会运行报错。 - 装饰器顺序错误:你把
@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
相关产品推荐
相关产品推荐

