Flask raises TemplateNotFound error even though template file exists

file, flask, python, templates

Solution

You must create your template files in the correct location; in the `templates` subdirectory next to the python module (== the module where you create your Flask app).

The error indicates that there is no `home.html` file in the `templates/` directory. Make sure you created that directory in the same directory as your python module, and that you did in fact put a `home.html` file in that subdirectory. If your app is a package, the templates folder should be created inside the package.

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

Alternatively, if you named your templates folder something other than `templates` and don't want to rename it to the default, you can tell Flask to use that other directory.

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

You can ask Flask to explain how it tried to find a given template, by setting the `EXPLAIN_TEMPLATE_LOADING` option to `True`. For every template loaded, you'll get a report logged to the Flask `app.logger`, at level `INFO`.

This is what it looks like when a search is successful; in this example the `foo/bar.html` template extends the `base.html` template, so there are two searches:

[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')

Blueprints can register their own template directories too, but this is not a requirement if you are using blueprints to make it easier to split a larger project across logical units. The main Flask app template directory is always searched first even when using additional paths per blueprint.

Problem

I am trying to render the file `home.html`. The file exists in my project, but I keep getting `jinja2.exceptions.TemplateNotFound: home.html` when I try to render it. Why can't Flask find my template? ``` from flask import Flask, render_template app = Flask(__name__) @app.route('/') def home(): return render_template('home.html') ``` ``` /myproject app.py home.html ```

Original source