如何在Jinja模板中调试所有变量?实现类PHP var_dump的调试函数
实现Jinja2中类似PHP var_dump的调试函数
要在自定义的Dump方法里获取所有模板变量,核心是拿到Jinja2的模板上下文(Context),下面是两种实用的实现方式:
方法1:使用contextfunction装饰器(推荐)
Jinja2内置的contextfunction装饰器可以让函数自动接收当前模板上下文作为第一个参数,无需在模板调用时额外传参:
from jinja2 import contextfunction @contextfunction def Dump(context) -> str: res = [] # context是包含所有模板变量的字典对象 for var_name, var_value in context.items(): # 过滤Jinja2内置的特殊变量(名称以_开头) if not var_name.startswith('_'): res.append(f"<strong>{var_name}</strong>: {repr(var_value)}") return '<br>'.join(res) # 将函数注册为模板全局函数 Tpl = Env.get_template(Route, globals={'Dump': Dump}) Tpl.render({'var1': 'hello', 'var2': 'world'})
模板中直接调用即可:
{{ Dump() }}
方法2:手动传递上下文变量
如果不想用装饰器,也可以在渲染时把上下文变量传入模板,再在调用函数时传递:
def Dump(context) -> str: res = [] for var_name, var_value in context.items(): if not var_name.startswith('_'): res.append(f"<strong>{var_name}</strong>: {repr(var_value)}") return '<br>'.join(res) # 渲染时将上下文作为变量传入模板 render_vars = {'var1': 'hello', 'var2': 'world'} Tpl.render({**render_vars, 'context': render_vars})
模板中调用方式:
{{ Dump(context) }}
额外说明
- 上下文会包含Jinja2的内置特殊变量(如
loop、_jinja2_template),通过过滤_开头的变量可以只展示用户自定义的变量。 - 使用
repr(var_value)可以获取变量的类型+值的详细表示,更贴近PHPvar_dump的调试效果。 - 若需要更友好的可视化,可将输出格式化为HTML列表或带样式的容器,方便调试查看。
内容的提问来源于stack exchange,提问作者VladVons
相关产品推荐
相关产品推荐

