在Flask中从父应用继承配置

0 投票
1 回答
926 浏览
提问于 2025-04-18 04:56

我有一个应用程序,它的结构如下:

app = Flask(__name__)

app.wsgi_app = DispatcherMiddleware(frontend.create_app(), {
    '/api': api.create_app()
})

app.config['DATABASE'] = db

我想在 frontendapi 应用中访问同一个数据库,但是当我在注册到 api 的蓝图中运行类似 current_app.config['DATABASE'] 的代码时,出现了 KeyError: 'DATABASE' 的错误。有没有办法让配置可以继承,这样测试等只需要修改最上层的设置就可以了?谢谢。

1 个回答

3

只需要把你在 frontendapi 中的 create_app 方法改成接受一个配置字典,然后用 flask.Config 来创建一个包含所有 app.config 属性的配置(这些属性可以从环境变量等地方加载):

from flask import Config
from werkzeug.wsgi import DispatcherMiddlware

config = Config()
config.from_envvar("YOUR_PROGRAM_CONFIG")

app = DispatcherMiddlware(frontend.create_app(config), {
    '/api': api.create_app(config)
})

这样你就可以把提供的配置和你每个应用的配置合并在一起:

def create_app(config):
    app = Flask(__name__)
    app.config.update(config)

    # Potentially, load another config
    app.config.from_envvar("YOUR_PROGRAM_CONFIG_FRONTEND", silent=True)

    return app

需要注意的是,不需要为了路由到其他应用而创建一个新的应用——调度中间件已经可以为你完成这个工作。

另外,如果你已经在使用蓝图,那么直接把蓝图打包并在一个应用中组合它们可能更合适,而不是使用调度中间件(当然,这也要看你的应用有多复杂)。

撰写回答