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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:06