我试图渲染文件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

当前回答

我不知道为什么,但我不得不使用下面的文件夹结构。我把“模板”提升了一层。

project/
    app/
        hello.py
        static/
            main.css
    templates/
        home.html
    venv/

这可能表明其他地方的配置错误,但我不知道那是什么,这是可行的。

其他回答

检查:

模板文件名称正确 模板文件在名为templates的子目录中 你传递给render_template的名称是相对于模板目录的(index.html将直接在模板目录下,auth/login.html将在模板目录下的auth目录下)。 你要么没有与你的应用同名的子目录,要么模板目录在该子目录中。

如果这不起作用,打开调试(app.debug = True),这可能有助于找出问题所在。

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

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

另一种解释是我自己想出来的 当你创建Flask应用程序时,模板所在的文件夹是应用程序的文件夹,根据你提供给Flask构造函数的名称:

app = Flask(__name__)

这里的__name__是应用程序正在运行的模块的名称。因此适当的文件夹将成为文件夹搜索的根文件夹。

projects/
    yourproject/
        app/
            templates/

因此,如果你提供了一些随机名称,根文件夹的搜索将是当前文件夹。

另一种替代方法是设置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)

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