python - jinja2.exceptions.TemplateNotFound 扩展模板时出现错误
python - jinja2.exceptions.TemplateNotFound error raised when extending a template
我正在渲染一个找不到要扩展的基础文件的模板。
相关 Flask 应用结构:
project\
content\
templates\
content\
selection.html
content.py
__init__.py
general\
templates\
general\
base.html
general.py
__init__.py
__init__.py
content 和 general 中的 init 文件是空白的。该应用程序来自项目中的初始化文件运行。
content.py(所有作品-供奉):
content = Blueprint("content", __name__, template_folder="templates")
@content.route("/options")
def options():
show_id = request.args.get("selection", "")
removal_id = request.args.get("chosen", "")
clear = request.args.get("reset", "")
if "selected_shows" not in session:
session["selected_shows"] = []
if show_id:
for show in library:
if show["id"] == show_id and show not in session["selected_shows"]:
session["selected_shows"].append({"id": show["id"], "defaultTitle": show["defaultTitle"]})
session.modified = True
if removal_id:
for show in session["selected_shows"]:
if show["id"] == removal_id:
session["selected_shows"].remove(show)
session.modified = True
if clear:
session["selected_shows"].clear()
session.modified = True
return render_template("content/selection.html", library=library, chosen=session["selected_shows"])
selection.html 以这一行开头:
{% extends "project\general\templates\general\base.html" %}
...这反过来会引发错误:
jinja2.exceptions.TemplateNotFound: project\general\templates\general\base.html
所以,这就是我所知道的:它可以找到 selection.html,但找不到 base.html。 (以前,我在项目的单个模板文件夹中有每个 html 文件,然后它就可以工作了,所以我知道我 base.html 设置的方式不是错误 - 它是关于我重组它以使用蓝图的方式。)
我试过了...
- 在正斜杠和反斜杠之间交换
- 更改文件路径的具体程度(如 this 回答中所建议),直到并包括直接来自我的 C 驱动器的完整路径
- 将我的 base.html 文件直接移动到项目文件夹中(并相应地更改路径)
- 在项目文件夹中创建一个新的模板文件夹并将 base.html 移动到那里(并相应地更改路径)
"url_for('base.html')"
...以及上述的各种组合。
我寻找答案的其他地方:
This answer 看起来应该可以,但我试过了,但没有用。
This user 与我的文件结构相似,但问题是不会呈现初始模板,而我的会。
This question 作为重定向非常流行,但围绕 render_template() 寻找模板文件夹。但是 render_template() 似乎并不是给我带来麻烦的原因。
我还查看了其他问题 , here, here, here, here, here, ... 以及其他问题。
以及文档 here and here.
我不排除我很愚蠢并且只是错过了一些明显应该已经回答我的问题的可能性。但我现在已经为此工作了几个小时(加上 15 分钟的休息时间),所以我真的希望不是这样。
让它识别两个模板的一种解决方法是将您的 template_folder
设置为基本目录(在您的情况下,'project'):
content = Blueprint("content", __name__, template_folder="../../project")
然后您可以从那里进入所需的文件夹并获取您的模板。
渲染模板看起来像这样:
return render_template("content/templates/content/selection.html")
并且包括基本模板应该适用于此:
{% extends "general/templates/general/base.html" %}
之所以如此,是因为设置 template_folder
适用于该蓝图中的所有模板。因此,如果您从该蓝图渲染模板,此 template_folder
也将应用于该模板。
我正在渲染一个找不到要扩展的基础文件的模板。
相关 Flask 应用结构:
project\
content\
templates\
content\
selection.html
content.py
__init__.py
general\
templates\
general\
base.html
general.py
__init__.py
__init__.py
content 和 general 中的 init 文件是空白的。该应用程序来自项目中的初始化文件运行。
content.py(所有作品-供奉):
content = Blueprint("content", __name__, template_folder="templates")
@content.route("/options")
def options():
show_id = request.args.get("selection", "")
removal_id = request.args.get("chosen", "")
clear = request.args.get("reset", "")
if "selected_shows" not in session:
session["selected_shows"] = []
if show_id:
for show in library:
if show["id"] == show_id and show not in session["selected_shows"]:
session["selected_shows"].append({"id": show["id"], "defaultTitle": show["defaultTitle"]})
session.modified = True
if removal_id:
for show in session["selected_shows"]:
if show["id"] == removal_id:
session["selected_shows"].remove(show)
session.modified = True
if clear:
session["selected_shows"].clear()
session.modified = True
return render_template("content/selection.html", library=library, chosen=session["selected_shows"])
selection.html 以这一行开头:
{% extends "project\general\templates\general\base.html" %}
...这反过来会引发错误:
jinja2.exceptions.TemplateNotFound: project\general\templates\general\base.html
所以,这就是我所知道的:它可以找到 selection.html,但找不到 base.html。 (以前,我在项目的单个模板文件夹中有每个 html 文件,然后它就可以工作了,所以我知道我 base.html 设置的方式不是错误 - 它是关于我重组它以使用蓝图的方式。)
我试过了...
- 在正斜杠和反斜杠之间交换
- 更改文件路径的具体程度(如 this 回答中所建议),直到并包括直接来自我的 C 驱动器的完整路径
- 将我的 base.html 文件直接移动到项目文件夹中(并相应地更改路径)
- 在项目文件夹中创建一个新的模板文件夹并将 base.html 移动到那里(并相应地更改路径)
"url_for('base.html')"
...以及上述的各种组合。
我寻找答案的其他地方:
This answer 看起来应该可以,但我试过了,但没有用。
This user 与我的文件结构相似,但问题是不会呈现初始模板,而我的会。
This question 作为重定向非常流行,但围绕 render_template() 寻找模板文件夹。但是 render_template() 似乎并不是给我带来麻烦的原因。
我还查看了其他问题
以及文档 here and here.
我不排除我很愚蠢并且只是错过了一些明显应该已经回答我的问题的可能性。但我现在已经为此工作了几个小时(加上 15 分钟的休息时间),所以我真的希望不是这样。
让它识别两个模板的一种解决方法是将您的 template_folder
设置为基本目录(在您的情况下,'project'):
content = Blueprint("content", __name__, template_folder="../../project")
然后您可以从那里进入所需的文件夹并获取您的模板。
渲染模板看起来像这样:
return render_template("content/templates/content/selection.html")
并且包括基本模板应该适用于此:
{% extends "general/templates/general/base.html" %}
之所以如此,是因为设置 template_folder
适用于该蓝图中的所有模板。因此,如果您从该蓝图渲染模板,此 template_folder
也将应用于该模板。