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

Jinja2无法读取templates文件夹中HTML模板问题咨询

解决Jinja2无法加载上级目录templates的问题

这个问题的核心在于Jinja2的FileSystemLoader是基于你初始化时指定的搜索路径来查找模板的,而且默认会阻止访问超出该路径的文件——这是内置的安全机制,用来防止路径遍历类的攻击。

为什么你的代码会失败?

假设你初始化环境时是这么写的:

env = Environment(loader=FileSystemLoader('.'))

这里的.代表你的Python脚本所在的目录。当你尝试用../templates/index.html获取模板时,相当于要跳出当前的搜索目录去上级找templates,Jinja2的默认安全策略会直接拒绝这种跨目录的访问请求,所以加载自然失败。

正确的解决方案

根据你的目录结构,这里提供两种可靠的解决方式:

方式1:扩展FileSystemLoader的搜索路径

把需要的模板目录都添加到loader的搜索路径列表里,Jinja2会自动在这些目录里依次查找模板:

from jinja2 import Environment, FileSystemLoader

# 同时把当前脚本目录和上级templates目录加入搜索路径
env = Environment(loader=FileSystemLoader(['.', '../templates']))

# 加载同目录的index.html
template_local = env.get_template('index.html')
# 加载templates目录的index.html(如果文件名重复,会优先匹配列表靠前的目录)
template_tpl = env.get_template('templates/index.html')

方式2:使用绝对路径初始化loader(推荐)

用绝对路径可以彻底避免相对路径带来的混乱,尤其适合项目结构复杂的场景:

import os
from jinja2 import Environment, FileSystemLoader

# 获取当前脚本的绝对目录
script_dir = os.path.dirname(os.path.abspath(__file__))
# 计算templates目录的绝对路径(根据你的实际结构调整)
templates_dir = os.path.join(script_dir, '../templates')
# 以templates目录为根路径初始化loader
env = Environment(loader=FileSystemLoader(templates_dir))

# 直接加载templates里的index.html
template = env.get_template('index.html')

额外提示

如果你的templates目录其实是当前脚本目录的子目录(比如./templates/index.html),那更简单,直接初始化loader时指定该子目录即可:

env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('index.html')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:21:08