使用Flask与Jinja时如何将服务端变量传递给include引入的footer模板
解决方案
方法1:直接使用(无需额外配置)
Jinja 模板的{% include %}语法默认会让引入的子模板继承父模板的全部上下文变量,你不需要做任何额外传递操作,直接在footer.html中使用{{ year }}即可正常读取服务端传给index.html的year值。
方法2:显式传参(适合自定义传参场景)
如果你需要明确指定传递给子模板的变量,或者要传递index.html中没有的额外变量,可以使用带with参数的引入语法:
{% include "footer.html" with year=year %}
如果需要传递多个变量,直接用空格分隔即可:
{% include "footer.html" with year=year site_title="个人站点" %}
如果希望子模板只能读取你主动传递的变量,禁止继承父模板的其他上下文,可以添加only关键字:
{% include "footer.html" with year=year only %}
方法3:全局注入(适合全站通用变量优化)
如果year这类版权年份是全站页面都需要的通用变量,不需要每个路由都手动在render_template中传参,可以使用Flask上下文处理器全局注入变量:
from datetime import datetime # 全局上下文处理器,所有模板都能读取返回的变量 @app.context_processor def inject_common_params(): return { "year": datetime.now().year }
配置完成后,你所有路由的render_template都无需再传递year参数,全站任意模板都可以直接调用{{ year }}获取值,大幅减少重复代码。
内容的提问来源于stack exchange,提问作者Visakh Unnikrishnan
相关产品推荐
相关产品推荐

