模板里为什么不用传 request 和 g 就能用?想让所有模板都有一个变量怎么写?处理器什么时候执行、执行几次?放太多会不会拖慢页面?这篇逐项实测。
GET /defaults → config=Config|request=/defaults|session=SecureCookieSession|g=_AppCtxGlobals|url_for=/defaults|flashed=0 update_template_context 往空字典里放了: ['bp_global', 'g', 'now_called', 'request', 'site_name', 'util'] Flask 自带的上下文处理器: ['_default_template_ctx_processor'] + 你注册的 3 个
上一篇:模板继承与 Block;下一篇:自定义 Template Filter。全局函数与它的区别见自定义 Template Global。
site_name = 视图里传的 (视图里显式传的优先于处理器) 不传时的 site_name: render_template_string → 被第二个覆盖
渲染 3 次后处理器被调用了 3 次 一次渲染里用 5 次变量,处理器只调用 1 次
GET /b/t(蓝图的视图)→ blueprint 的变量|bp 注册的全局变量 GET /t(应用的视图)→ 无|bp 注册的全局变量
渲染 3 次「没用到变量」的页面:eager 处理器执行 3 次(无论用不用都算);lazy 的函数执行 0 次 再渲染 1 次「用到 l_value()」的页面:lazy 函数执行 1 次
0 个处理器 每个请求 180 µs 10 个空处理器 每个请求 186 µs 10 个各 0.5 ms 的处理器 每个请求 7889 µs