You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问包外文件夹的Jinja2模板并解决TemplateNotFound报错

1. Jinja2可以访问当前文件夹外的模板文件

Jinja2本身没有禁止访问上层目录或其他外部路径模板的限制,只要运行脚本的进程对目标目录有读取权限,且模板加载器的路径配置正确,就可以正常加载任意位置的模板文件。

2. 你的路径写法确实存在错误

错误原因如下:
你在初始化FileSystemLoader时已经指定了搜索路径为../templates,相当于告诉Jinja2所有模板都从这个目录下查找。此时调用env.get_template()时只需要传入模板在该搜索目录下的相对路径,也就是直接写bill_template.html即可。
你现在的写法相当于让Jinja2去../templates目录下找路径为../templates/bill_template.html的文件,拼接后的实际查找路径为../templates/../templates/bill_template.html,和你实际的文件路径不符,因此触发找不到模板的报错。

修正后的参考代码

import os
from weasyprint import HTML
from jinja2 import Environment, FileSystemLoader

# 先获取当前脚本的绝对路径,避免运行时工作目录变化导致的路径错误
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
# 拼接得到templates目录的绝对路径
TEMPLATES_DIR = os.path.join(SCRIPT_DIR, '..', 'templates')

# 加载jinja2环境,搜索路径设为templates目录的绝对路径
env = Environment(loader=FileSystemLoader(TEMPLATES_DIR))

# 直接传模板文件名即可
template = env.get_template('bill_template.html')
html_out = template.render()
# 拼接css文件的路径
file_css = os.path.join(TEMPLATES_DIR, 'bill_style.css')
# 生成PDF,可自行修改输出的pdf文件名
HTML(string=html_out).write_pdf("output_bill.pdf", stylesheets=[file_css])

使用绝对路径拼接的方式可以避免你在不同目录下运行脚本时,相对路径定位错误的问题,稳定性更高。


内容的提问来源于stack exchange,提问作者Other_suns

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:36:04