(四)用应用工厂生成不同配置的应用
同一份书架程序需要打开真实数据文件,也需要在测试中使用临时库。先从一个只改变书架名称的工厂观察配置隔离。
# 项目文件:demos/factory_demo.py
from flask import Flask, current_app
def create_app(label="我的书架"):
app = Flask(__name__)
app.config["SHELF_LABEL"] = label
@app.get("/")
def index():
# 每次请求读取正在处理它的应用配置。
return {"label": current_app.config["SHELF_LABEL"]}
return app
if __name__ == "__main__":
first, second = create_app("阅读书架"), create_app("测试书架")
print(first.test_client().get("/").json)
print(second.test_client().get("/").json)create_app 每次新建一个 Flask 对象,登记自己的路由并返回。app.config 是配置映射;两次调用返回两个独立应用,因此分别输出“阅读书架”和“测试书架”。current_app 在调用时指向当前应用,函数没有把第一个 app 固定在全局。
Flask 命令能够找到名为 create_app 的工厂并调用。完整项目仍按“配置 → 登记功能 → 返回应用”的顺序组织,数据库连接留到实际使用时再取得。工厂模式的接口见 Flask 应用工厂。