Flask 官方生命周期文档强调得非常直接:
应用的 setup 必须在处理第一个请求之前完成。
也就是说,下面这些事应该在应用装配期做完:
- 注册路由
- 注册 Blueprint
- 加载配置
- 初始化扩展
- 配置 Jinja
- 配置 session / JSON provider / middleware
不要在请求处理中再去临时改这些东西。
错误示意:
@app.get("/bad")
def bad():
@app.get("/new-route")
def new_route():
return "too late"
return "wrong"为什么不行?
因为 WSGI 服务器可能已经把请求分给多个 worker 了。 你在某个请求里偷偷改地图,别的 worker 根本不一定同步。
把这个原则翻译成街区语言就是:
街区道路、岗哨、军令、外援编制,必须在开营前定好。 战斗进行中别一边接待来访,一边重画城市地图。