在Flask中从父应用继承配置
我有一个应用程序,它的结构如下:
app = Flask(__name__)
app.wsgi_app = DispatcherMiddleware(frontend.create_app(), {
'/api': api.create_app()
})
app.config['DATABASE'] = db
我想在 frontend
和 api
应用中访问同一个数据库,但是当我在注册到 api
的蓝图中运行类似 current_app.config['DATABASE']
的代码时,出现了 KeyError: 'DATABASE'
的错误。有没有办法让配置可以继承,这样测试等只需要修改最上层的设置就可以了?谢谢。
1 个回答
3
只需要把你在 frontend
和 api
中的 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
需要注意的是,不需要为了路由到其他应用而创建一个新的应用——调度中间件已经可以为你完成这个工作。
另外,如果你已经在使用蓝图,那么直接把蓝图打包并在一个应用中组合它们可能更合适,而不是使用调度中间件(当然,这也要看你的应用有多复杂)。