使用自定义加载器时如何查看Jinja2顶级模板代码?
如何在Jinja2中打印动态生成的顶级模板代码
Jinja2的模板实例自带source属性,可直接获取模板的原始代码,你可以在捕获渲染异常时通过这个属性打印顶级模板内容,具体实现如下:
方法1:在异常处理中直接访问模板实例的source属性
from jinja2 import Environment, BaseLoader class CustomLoader(BaseLoader): def get_source(self, environment, template_name): # 这里是你动态生成模板代码的逻辑 dynamic_source = "{% for item in items %}{{ item }}{% endfor %}" return dynamic_source, template_name, lambda: False # 初始化环境与模板 env = Environment(loader=CustomLoader()) top_template = env.get_template("placeholder_name") try: # 尝试渲染模板 rendered_result = top_template.render(items=[1, 2, 3]) except Exception as e: # 打印顶级模板代码 print("=== 顶级模板代码 ===") print(top_template.source) # 打印错误详情 print(f"\n=== 渲染错误 ===") print(str(e))
方法2:提前保存模板代码(避免异常中无法访问模板实例的情况)
如果你的业务逻辑中,异常处理块无法直接获取到模板实例,可以在渲染前先保存模板代码:
top_template = env.get_template("placeholder_name") # 提前缓存顶级模板代码 template_source = top_template.source try: rendered_result = top_template.render() except Exception as e: print("=== 顶级模板代码 ===") print(template_source) print(f"\n=== 渲染错误 ===") print(str(e))
注意事项
template.source返回的就是你自定义加载器中get_source方法返回的顶级模板内容,完全匹配动态生成的代码。- 如果模板存在嵌套引用(比如使用
{% include %}或{% extends %}),template.source仅返回当前顶级模板的代码,嵌套模板的代码需要通过对应的子模板实例访问。
内容的提问来源于stack exchange,提问作者mnieber
相关产品推荐
相关产品推荐

