Flask Web Server
Flask首先完成两个上下文压栈: 1. 压入应用上下文(AppCtx):创建代理对象current_app和g 2. 压入请求上下文(RequestContext):创建request和session代理对象
执行响应后钩子函数@app.after_request
执行收尾清理钩子函数@app.teardown_request@app.teardown_application
触发异常处理@app.errorhandler
匹配路由执行视图函数View Function
执行请求前钩子函数@app.before_request
HTTP响应
如果在请求前钩子或视图函数中发生未处理的异常: 1.跳过步骤 4(after_request) 2.查找并执行匹配的 @app.errorhandler 或 @bp.errorhandler 3.生成代表错误状态(如 500 或 404)的 Response 对象
创建上下文并压入栈
HTTP请求
此阶段类似于 Python 的 finally 块,按**注册逆序(倒序)**清理资源: 1.执行 @app.teardown_request(传入 exception 参数)。 2.弹出请求上下文,request 和 session 销毁。 3.执行 @app.teardown_appcontext(传入 exception 参数,在此自动关闭 g.db 等连接) 4.弹出应用上下文,current_app 和 g 销毁
客户端