Python 即使模板文件存在,Flask也会引发TemplateNotFound错误

Python 即使模板文件存在,Flask也会引发TemplateNotFound错误,python,file,templates,flask,Python,File,Templates,Flask,我正在尝试渲染文件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') 您必须在正确的位置创建模板文

我正在尝试渲染文件
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')

您必须在正确的位置创建模板文件;在python模块(=创建Flask应用程序的模块)旁边的
templates
子目录中

该错误表示
templates/
目录中没有
home.html
文件。确保您在与python模块相同的目录中创建了该目录,并且确实在该子目录中放置了一个
home.html
文件。如果你的应用程序是一个软件包,那么应该在软件包内创建templates文件夹

myproject/
    app.py
    templates/
        home.html
或者,如果您将templates文件夹命名为
templates
以外的名称,并且不想将其重命名为默认名称,则可以告诉Flask使用其他目录

app = Flask(__name__, template_folder='template')  # still relative to module
通过将设置为
True
,您可以要求Flask解释它如何尝试查找给定模板。对于加载的每个模板,您将在
INFO
级别获得一个记录到的报告

这就是搜索成功时的样子;在本例中,
foo/bar.html
模板扩展了
base.html
模板,因此有两个搜索:

调试助手中的信息:定位模板“foo/bar.html”: 1:正在尝试应用程序“flaskpackagename”的加载程序 类:jinja2.loaders.FileSystemLoader 编码:“utf-8” followlinks:错误 搜索路径: -/…/project/flaskpackagename/templates ->找到(“/…/project/flaskpackagename/templates/foo/bar.html”) [2019-06-15 16:03:39203]调试帮助程序中的信息:定位模板“base.html”: 1:正在尝试应用程序“flaskpackagename”的加载程序 类:jinja2.loaders.FileSystemLoader 编码:“utf-8” followlinks:错误 搜索路径: -/…/project/flaskpackagename/templates ->找到(“/…/project/flaskpackagename/templates/base.html”) 蓝图也可以,但如果您使用蓝图使更容易在逻辑单元之间拆分更大的项目,则这不是一个要求。始终首先搜索主Flask应用程序模板目录,即使在使用每个蓝图的其他路径时也是如此。

请检查:

  • 模板文件具有正确的名称
  • 模板文件位于名为
    templates
  • 传递给
    render\u template
    的名称与模板目录相关(
    index.html
    将直接位于模板目录中,
    auth/login.html
    将位于模板目录中的auth目录下。)
  • 您没有与应用同名的子目录,或者templates目录位于该子目录中

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

    我不知道为什么,但我不得不使用以下文件夹结构。我把“模板”提高了一级

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

    这可能表明其他地方存在错误配置,但我无法确定这是什么,这起到了作用。

    您需要将所有
    .html
    文件放在python模块旁边的模板文件夹中。如果html文件中使用了任何图像,则需要将所有文件放在名为static

    在以下结构中

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

    我也犯了同样的错误,结果我唯一的错误就是把我的“templates”文件夹命名为没有“s”的“template”。
    更改后,它工作正常,不知道为什么这是一件事,但它是。

    我认为Flask默认使用目录
    模板。所以你的代码应该是这样的

    假设这是您的
    hello.py

    from flask import Flask,render_template
    
    app=Flask(__name__,template_folder='template')
    
    
    @app.route("/")
    def home():
        return render_template('home.html')
    
    @app.route("/about/")
    def about():
        return render_template('about.html')
    
    if __name__=="__main__":
        app.run(debug=True)
    
    你的工作空间结构就像

    project/
        hello.py        
        template/
             home.html
             about.html    
        static/
               js/
                 main.js
               css/
                   main.css
    
    您还创建了两个名为
    home.html
    about.html
    的html文件,并将这些文件放在
    templates
    文件夹中。

    使用render\u template()函数时,它尝试在名为templates的文件夹中搜索模板,并在以下情况下抛出错误jinja2.exceptions.TemplateNotFound:

  • html文件不存在或不存在
  • 当模板文件夹不存在时
  • 要解决此问题,请在python文件所在的同一目录中创建一个名为templates的文件夹,并将创建的html文件放置在templates文件夹中

    (请注意,为文件/项目结构提供的上述公认答案绝对正确。)

    还有

    除了正确设置项目文件结构外,我们还必须告诉flask查看目录层次结构的适当级别

    例如

        app = Flask(__name__, template_folder='../templates')
    
    开始。/
    向后移动一个目录并从那里开始

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


    希望这有帮助

    另一种选择是设置
    根路径
    ,它解决了模板和静态文件夹的问题

    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)
    

    如果从安装的软件包运行代码,请确保模板文件位于目录
    /lib/site packages/your package/templates


    一些细节:

    在我的例子中,我试图运行project的示例,
    jinja
    总是这样说

    jinja2.exceptions.TemplateNotFound:form.html

    诀窍是示例程序将导入已安装的包
    flask\u simple\u ui
    。在我的例子中,
    …python/lib/site packages/flask\u simple\u ui
    ,从包内部使用的
    ninja
    用作查找包路径的根目录。
        app = Flask(__name__, template_folder='../templates', static_folder='../static')
    
    root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent
    app = Flask(__name__.split('.')[0], root_path=root_path)
    
    ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates')))
    template = ENV.get_template(your_template_name)
    
    app = Flask(__name__)
    
    projects/
        yourproject/
            app/
                templates/