为什么都说要用 create_app()?它解决了什么问题?扩展怎么配合?命令行与 gunicorn 怎么找到它?这篇先复现没有工厂的麻烦,再逐项验证工厂模式。
视图模块在顶部写 from bad.app import app,应用模块又在顶部 from bad import views → ImportError: cannot import name 'app' from partially initialized module 'bad.app' 常见的绕法:把 from bad2 import views 放到 app.py 的末尾。导入 bad2.app 时路由已注册: ['/'] 整个进程里只有一个 app 实例,config["NAME"] = 全局唯一 | 再导入一次得到的是同一个对象: True (想要两套不同配置的实例:做不到)
三个实例: ['app-one', 'app-two', 'default'] | 互不相同: True
各自的响应: [{'ext': {'name': 'app-one'}, 'name': 'app-one'}, {'ext': {'name': 'app-two'}, 'name': 'app-two'}]
EXTRA 只在 a2 的配置里: [False, True, False]
各自的路由表独立: [2, 2, 2] 同一个 db_like 对象先后被绑定到的应用: ['app-one', 'app-two', 'default']
每个应用自己的 extensions 字典: [{'name': 'app-one'}, {'name': 'app-two'}, {'name': 'default'}]views.py 里 import 了 app 吗? False | 用 current_app: True 在应用上下文之外访问 current_app → RuntimeError: Working outside of application context. with a2.app_context(): current_app.config["NAME"] = app-two
flask --app good(自动发现 create_app) → 退出码 0
flask --app "good:create_app()" → 退出码 0
flask --app "good:create_app({'NAME': 'cli'})" → 退出码 0
flask --app mod_app(模块里有 app 变量) → 退出码 0
flask --app mod_app:make_app → 退出码 0
flask --app nope → 退出码 2 Error: Could not import 'nope'.
gunicorn "good:create_app()" → GET / → {"ext":{"name":"default"},"name":"default"}create_app(...) 每次 305 µs