Python Flask如何将全局字典传递给Blueprint模块
Flask Blueprint 共享全局字典的可行方案
核心思路
不用在每个Blueprint里重复加载字典,直接把全局数据挂载到Flask应用实例上,各个模块通过current_app统一访问即可,完全避免重复代码。
具体实现步骤
1. 初始化时加载字典并绑定到应用实例
在应用入口(比如app.py)里完成全局字典的加载,然后挂载到Flask app对象上:
from flask import Flask from client import client_bp from product import product_bp from order import order_bp def create_app(): app = Flask(__name__) # 加载全局字典(替换成你实际的加载逻辑) app.client_dict = load_client_data() app.product_dict = load_product_data() app.order_dict = load_order_data() # 注册各个Blueprint app.register_blueprint(client_bp, url_prefix='/client') app.register_blueprint(product_bp, url_prefix='/product') app.register_blueprint(order_bp, url_prefix='/order') return app
2. 在Blueprint模块中访问全局字典
各个模块只需要通过flask.current_app就能拿到这些字典,无需重复加载:
Client模块(client.py)
from flask import Blueprint, current_app client_bp = Blueprint('client', __name__) @client_bp.route('/<client_id>') def get_client(client_id): return current_app.client_dict.get(client_id, 'Client not found')
Order模块(order.py)
from flask import Blueprint, current_app order_bp = Blueprint('order', __name__) @order_bp.route('/<order_id>') def get_order_detail(order_id): order = current_app.order_dict.get(order_id) if not order: return 'Order not found' # 直接查询Client和Product字典 client_info = current_app.client_dict.get(order['client_id']) product_info = current_app.product_dict.get(order['product_id']) return { 'order': order, 'client': client_info, 'product': product_info }
额外优化建议
- 针对Order模块无需修改字典的需求,可以把字典封装成只读类型,防止误修改:
class ReadOnlyDict(dict): def __setitem__(self, key, value): raise TypeError('该字典为只读,禁止修改') # 在create_app中替换加载逻辑 app.client_dict = ReadOnlyDict(load_client_data()) app.product_dict = ReadOnlyDict(load_product_data())
这样如果代码中不小心尝试修改这两个字典,会直接抛出错误,符合你的权限要求。
- 也可以把字典存入
app.config(Flask官方推荐的配置存储方式),比如app.config['CLIENT_DICT'] = load_client_data(),访问时用current_app.config['CLIENT_DICT'],逻辑和挂载到app属性上一致。
内容的提问来源于stack exchange,提问作者Werner Venter
相关产品推荐
相关产品推荐

