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

时间:2014-04-27 18:30:29

标签: python 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')
/myproject
    app.py
    home.html

12 个答案:

答案 0 :(得分:116)

您必须在正确的位置创建模板文件;在你的python模块旁边的templates子目录中。

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

包中创建模板文件夹。

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

答案 1 :(得分:3)

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

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

这可能表明其他地方的配置错误,但我无法弄清楚这是什么,这是有效的。

答案 2 :(得分:2)

检查:

  1. 模板文件具有正确的名称
  2. 模板文件位于名为templates
  3. 的子目录中
  4. 您传递给render_template的名称是相对于模板目录的(index.html将直接位于模板目录中,auth/login.html将位于模板目录中的auth目录下。)
  5. 您要么没有与您的应用名称相同的子目录,要么模板目录位于该子目录中。
  6. 如果这不起作用,请启用调试(app.debug = True),这可能有助于找出问题所在。

答案 3 :(得分:2)

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

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)

答案 4 :(得分:1)

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

的文件夹中

在以下结构

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

答案 5 :(得分:0)

我遇到了同样的错误,结果我唯一做错的就是将我的“模板”文件夹命名为“模板”而不命名为“ s”。 更改它可以正常工作后,不知道为什么它是东西,但是它是。

答案 6 :(得分:0)

使用render_template()函数时,它将尝试在名为template的文件夹中搜索模板,并在以下情况时引发错误jinja2.exceptions.TemplateNotFound:

  1. html文件不存在或
  2. 模板文件夹不存在时

要解决此问题:

在python文件所在的目录中创建一个包含名称模板的文件夹,并将创建的html文件放置在模板文件夹中。

< / p>

答案 7 :(得分:0)

在遵循该主题和其他主题为相同问题的解决方案而没有成功之后,我找到了当前项目的有效解决方案。 (请注意,上面为文件/项目结构提供的已接受答案在大多数情况下都可以使用,并且绝对正确,我只是显示专门针对我的项目的答案,因为这些论坛上的大多数类似答案都无法解决问题。 )

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

帮了我大忙。 对于/static/style.css同样如此 发现.css文件未正确链接到.html文件后...

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

我希望这对您有帮助

答案 8 :(得分:0)

另一种替代方法是设置Step 1 At the start, please open up the SQL Server Management Studio. Log into the target database, and right click the database. Please note that you shall click on the entire database, rather than a particular table. From the Object Explorer, you shall point to the button of Tasks, and find the Import Data. Step 2 Please note that the Wizard introduction page might be popped up. When you see such introduction page, please safely click on next. This is the screen prompting the selection of a data source. From the screen, you shall select the Flat File source from the Dropdown box, and the Browse button. Step 3 From the Windows Explorer, you shall select the designated CSV file. In order to ensure you select the correct file type, it is the best practice to select the filetype as CSV, but not TXT. Therefore, only CSV filetype shall be displayed. Step 4 After the selection of the CSV file, please allocate some time to configure how to import the data into the database before you click the Next > button. Note that you shall ensure the First Data Row checked, because the file shall then contain the required column names. From the following image, you shall see the Column Names from the SQL Server Management Studio shall try their best to important header row instead. Step 5 After the review of columns, you shall examine more advanced options. The review is important before you completely import the CSV file. From the image below, by default, the SQL Server set the length of each string to be 50. Step 6 If you have string that is larger than 50, please request the SQL Server to inspect all columns in the file. The inspection can be done by clicking on the Suggest Types button. SQL Server shall be instructed to examine only the first 100 rows, giving suggested types of each column. Error shall be pointed out during the inspection process. Depending on the file size, you can select to inspect the whole file or just selected the fields. Step 7 You will be prompted to the Preview section from the Data Source page. That will be the last time to examine columns again. Step 8 After your review on the import preview, you shall select your destination database. Step 9 In this step, you shall select your destination database. The SQL Server normally selects the desired table on behalf of you. If it is not the case, please create your table. If you would like to select a different table, please click on the destination column for action. Step 10 You are required to prompt to the option in order to save as an SSIS package. You can also leave the option unchecked as is. Please click next. Step 11 Finally, you will be prompted to the verification screen. If you are fine with everything, please run the Import by click the Finish. ,该问题可以解决模板和静态文件夹的问题。

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

答案 9 :(得分:0)

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


一些细节:

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

  

jinja2.exceptions.TemplateNotFound:form.html

诀窍是示例程序将导入已安装的软件包flask_simple_ui。从该软件包内部使用的ninja用作查找软件包路径的根目录,在我的情况下为...python/lib/site-packages/flask_simple_ui,而不是人们期望的os.getcwd()

倒霉的是,setup.py有一个错误,并且不会复制任何html文件,包括丢失的form.html。修复setup.py后, TemplateNotFound 的问题就消失了。

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

app = Flask(__name__)

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

projects/
    yourproject/
        app/
            templates/

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