尽管模板文件存在,Flask 仍会引发 TemplateNotFound 错误

2024-11-27 10:43:00
admin
原创
237
摘要:问题描述:我正在尝试渲染文件home.html。该文件存在于我的项目中,但当jinja2.exceptions.TemplateNotFound: home.html我尝试渲染它时,我不断收到错误。为什么 Flask 找不到我的模板?from flask import Flask, render_templa...

问题描述:

我正在尝试渲染文件home.html。该文件存在于我的项目中,但当jinja2.exceptions.TemplateNotFound: home.html我尝试渲染它时,我不断收到错误。为什么 Flask 找不到我的模板?

from flask import Flask, render_template

app = Flask(__name__)

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

解决方案 1:

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

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

myproject/
    app.py
    templates/
        home.html
myproject/
    mypackage/
        __init__.py
        templates/
            home.html

或者,如果您将模板文件夹命名为其他名称templates并且不想将其重命名为默认名称,则可以告诉 Flask 使用其他目录。

app = Flask(__name__, template_folder='template')  # still relative to module

EXPLAIN_TEMPLATE_LOADING您可以通过将选项设置为来要求 Flask 解释它如何尝试找到给定的模板。对于每个加载的模板,您都会在Flask级别True获得一份记录的报告。app.logger`INFO`

搜索成功时的情况如下;在此示例中,foo/bar.html模板扩展了base.html模板,因此有两个搜索:

[2019-06-15 16:03:39,197] INFO in debughelpers: Locating template "foo/bar.html":
    1: trying loader of application "flaskpackagename"
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /.../project/flaskpackagename/templates
       -> found ('/.../project/flaskpackagename/templates/foo/bar.html')
[2019-06-15 16:03:39,203] INFO in debughelpers: Locating template "base.html":
    1: trying loader of application "flaskpackagename"
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /.../project/flaskpackagename/templates
       -> found ('/.../project/flaskpackagename/templates/base.html')

蓝图也可以注册自己的模板目录,但如果您使用蓝图来更轻松地将较大的项目拆分为多个逻辑单元,则这不是必需的。即使每个蓝图使用其他路径,也始终会首先搜索主 Flask 应用模板目录。

解决方案 2:

templates我认为 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        
    templates/
         home.html
         about.html    
    static/
           js/
             main.js
           css/
               main.css

此外,您必须创建两个名为和的 html 文件home.html并将about.html这些文件放入templates文件夹中。

解决方案 3:

我们只需查看项目目录层次结构的适当级别即可。重点是了解文件结构和组织布局。

例如..

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

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

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

或在子目录内...(进入目录树)

template_folder='templates/some_template/nested_directory/nested_file.py'

解决方案 4:

我不知道为什么,但我不得不使用以下文件夹结构。我将“模板”放在了上一级。

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

这可能表明其他地方存在配置错误,但我无法弄清楚那是什么,并且它有效。

解决方案 5:

如果从已安装的包运行代码,请确保模板文件存在于目录中<python root>/lib/site-packages/your-package/templates


一些细节:

就我而言,我试图运行flask_simple_ui项目的示例,jinja总是会说

jinja2.exceptions.TemplateNotFound:表单.html

诀窍在于示例程序会导入已安装的包flask_simple_ui。并且ninja从该包内部使用时,会使用根目录来查找包路径,在我的例子中...python/lib/site-packages/flask_simple_ui,而不是os.getcwd() 像人们所期望的那样。

不幸的是,setup.py有一个错误,无法复制任何 html 文件,包括丢失的form.html。一旦我修复了, TemplateNotFoundsetup.py的问题就消失了。

我希望它能对某些人有所帮助。

解决方案 6:

**如果有人第一次运行你的python代码,并且你在顶层的同一目录中创建一个html文件和python文件,那么
app = Flask(__name__, template_folder='')
这将会起作用**

解决方案 7:

检查:

  1. 模板文件具有正确的名称

  2. 模板文件位于名为templates

  3. 您传递给的名称render_template是相对于模板目录的(index.html将直接位于模板目录中,auth/login.html将位于模板目录中的 auth 目录下。)

  4. 您没有与您的应用程序同名的子目录,或者模板目录位于该子目录内。

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

解决方案 8:

我遇到了同样的错误,结果发现我唯一做错的是将“templates”文件夹命名为“template”,没有“s”。更改后,它工作正常,不知道为什么会这样,但事实就是如此。

解决方案 9:

pycharm 截图

无需更改,只需将index.html文件放入模板文件夹内。

解决方案 10:

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

在以下结构中

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

解决方案 11:

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

  1. 文件不存在或

  2. 模板文件夹不存在

在python文件所在的同一目录中创建一个名为templates的文件夹,并将创建的html文件放在templates文件夹中。

解决方案 12:

经过大量的工作,我终于从这篇文章中找到了解决方案,
链接到解决方案帖子

向 template_folder 参数添加完整路径

app = Flask(__name__,
        template_folder='/home/project/templates/'
        )

解决方案 13:

我的解决方案是针对谁设置了flask 应用程序名称

from flask import Flask, render_template

app = Flask('MATH') # <---- the name should be different from project folder name. For example uppercase

@app.route('/')

将 flask 实例名称与项目目录名称区分开来非常重要。例如 'math1' 或 'Math' 或 'MATH'

项目树:

/math/
  app.py
  templates/
    hello.html

解决方案 14:

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

解决方案 15:

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

愚蠢的错误,但它可能会对某些人有所帮助。

解决方案 16:

我犯了一个愚蠢的错误。我输入templates了密码,如下所示:

    return render_template('./templates/index.html')

但是,您只需提供相对于templates目录的通行证,即:

    return render_template('./index.html')

解决方案 17:

侧面回答,在我的情况下,错误是字符串' main '

app = Flask('__main__', template_folder='templates')

某些情况下,‘主要__name__’会为不同的应用程序进行配置,这就是为什么当更改回原来的应用程序时,它无法找到模板的原因

app = Flask(__name__, template_folder='templates')

**如文档中关于名称**所述

第一个参数是应用程序模块或包的名称。如果您使用的是单个模块(如本例所示),则应使用
名称,因为根据它是作为应用程序启动还是作为模块导入,名称会有所不同(“ main ”与实际导入名称)。

[1]: https: //flask.palletsprojects.com/en/1.1.x/quickstart/#: ~:text =The%20first%20argument%20is%20the,与%20the%20actual%20import%20name)。

解决方案 18:

我最近也遇到了同样的问题。我想用 pyinstaller“--onefile exe”我的 Python 脚本,但使用的 jinja2 模板不可用:“ jinja2.exceptions.TemplateNotFound

但首先这里有帮助:

pyinstaller --clean --onefile --windowed --add-data "..\templates*;templates." --splash ..\img\splash2.png ..\main.py

以及加载 jinja 模板本身的代码:

template_loader = ''
if getattr(sys, 'frozen', False):
    # for the case of running in pyInstaller's exe
    bundle_dir = sys._MEIPASS
    logging.info(bundle_dir)
    template_loader = jinja2.FileSystemLoader(
        path.join(bundle_dir, 'templates'))
else:
    # for running locally
    template_loader = jinja2.FileSystemLoader(searchpath="./templates")

template_env = jinja2.Environment(loader=template_loader)
template = template_env.get_template('template_configuration_file.txt')
filled_template = template.render(columns=columns)

with open(output_path, "w") as fh:
    fh.write(filled_template)

现在来谈谈原因。

首先:如果您使用“--onefile”标志,pyinstaller 将创建一个 .exe 文件。当您运行它时,操作系统会将文件提取到您个人帐户下的临时MEIPASS文件夹中。这就是为什么我们需要区分“ if getattr(sys, 'frozen', False): ”和以“正常方式”运行脚本(如代码片段中所示)。

第二:Jinja 通常会忽略 *.txt 文件,因此我还看到了一些建议,即创建一个假的 python 文件来欺骗 pyInstaller。无需这样做,只需设置标志“--add-data origin;destination”(这里我将模板文件夹中的所有文件也添加到模板文件夹中,但在目标目录中)。对于 unix 系统,您需要使用“:”而不是“;”作为分隔符。

第三,我遇到了一个错误,即使我设置了“--add-data”标志,模板也不会被添加。额外的“--clean”标志在这里有所帮助!

希望它能帮助节省调试时间:-)

解决方案 19:

我自己找到了另一种解释当您创建 Flask 应用程序时,所templates查找的文件夹是根据您向 Flask 构造函数提供的名称的应用程序文件夹:

app = Flask(__name__)

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

projects/
    yourproject/
        app/
            templates/

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用