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 ```