bigywater.tech
Flask · 56

自定义 Template Global

全局函数和上下文处理器有什么区别?为什么宏里看不到我注入的变量?时间值能不能直接放全局?这篇用同一个应用把它们对比一遍。

12 个
本机 Flask 环境里默认的模板全局个数
0 次
渲染 100 次不使用变量的模板时,全局函数被执行的次数
with context
让被导入的宏看到上下文处理器变量的写法

全局函数与全局值

实测 · 本机执行输出
  {{ utcnow().year }}                  → 2026
  {{ site_url("/a") }}                 → https://example.test/a
  {{ initials("张 三 四") }}              → 张三四
  {{ SITE_NAME }} v{{ VERSION|join(".") }} → bigywater v1.2.3
  {{ from_bp() }}                      → bp 注册的全局函数
  {{ current_path() }}                 → /page|T
  {{ current_path() }}                 → /page|T
  {{ utcnow }}                         → <function utcnow at 0x107594930>

上一篇:自定义 Template Filter;下一篇:自定义 Template Test;上下文处理器:Context Processor。

同名时谁优先

实测 · 本机执行输出
  视图里传 SITE_NAME →  被视图覆盖

宏里的可见性

实测 · 本机执行输出
  import … 默认(不带 context)      → 全局:bigywater|处理器变量:看不到|request:/page
  import … with context           → 处理器变量:来自上下文处理器

默认全局

实测 · 本机执行输出
   ['config', 'cycler', 'dict', 'g', 'get_flashed_messages', 'joiner', 'lipsum', 'namespace', 'range', 'request', 'session', 'url_for']

求值时机

实测 · 本机执行输出
  全局值 STARTED_AT 两次渲染相同: True
  全局函数 now_ts() 两次渲染不同: True

执行次数

实测 · 本机执行输出
  渲染 100 次不使用变量的模板:处理器执行 100 次;全局函数执行 0 次

分步演示

模板全局
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:全局函数在异步模板里的 await 行为、国际化(gettext)全局的安装方式、模板里 {% set %} 与全局同名时的遮蔽、全局名字与过滤器同名时的行为
    京ICP备2026067502号-1京公网安备11010502063487号