我试图渲染文件home.html。该文件存在于我的项目中,但我一直得到jinja2.exceptions。TemplateNotFound: home.html当我试图渲染它。为什么弗拉斯克找不到我的模板?

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('home.html')
/myproject
    app.py
    home.html

当前回答

如果必须使用自定义的项目目录结构(而不是公认的答案项目结构), 我们可以选择告诉flask在目录层次结构的适当级别中查找。

例如. .

    app = Flask(__name__, template_folder='../templates')
    app = Flask(__name__, template_folder='../templates', static_folder='../static')

从…开始/向后移动一个目录并从那里开始。

从../..开始/向后移动两个目录并从那里开始(依此类推…)。

在子目录中…

template_folder='templates/some_template'

其他回答

我有同样的错误,原来我唯一做错的是命名我的'模板'文件夹,'模板'没有's'。 在改变之后,它工作得很好,不知道为什么这是一件事,但它是。

你需要把所有的。html文件放在python模块旁边的模板文件夹中。如果你的html文件中有任何图片,那么你需要把所有的文件都放在名为static的文件夹中

在以下结构中

project/
    hello.py
    static/
        image.jpg
        style.css
    templates/
        homepage.html
    virtual/
        filename.json

如果必须使用自定义的项目目录结构(而不是公认的答案项目结构), 我们可以选择告诉flask在目录层次结构的适当级别中查找。

例如. .

    app = Flask(__name__, template_folder='../templates')
    app = Flask(__name__, template_folder='../templates', static_folder='../static')

从…开始/向后移动一个目录并从那里开始。

从../..开始/向后移动两个目录并从那里开始(依此类推…)。

在子目录中…

template_folder='templates/some_template'

我的问题是,我从home.html中引用的文件是.j2而不是.html,当我把它改回来时,jinja可以读取它。

愚蠢的错误,但也许能帮到别人。

另一种替代方法是设置root_path,它可以修复模板和静态文件夹的问题。

root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent
app = Flask(__name__.split('.')[0], root_path=root_path)

如果你直接通过Jinja2渲染模板,那么你可以这样写:

ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates')))
template = ENV.get_template(your_template_name)