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__) def home(): return render_template('home.html')
/myproject app.py home.html
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
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.
I think Flask uses the directory
templates by default. So your code should be like this
suppose this is your
from flask import Flask,render_template app=Flask(__name__,template_folder='template') def home(): return render_template('home.html') def about(): return render_template('about.html') if __name__=="__main__": app.run(debug=True)
And you work space structure like
project/ hello.py template/ home.html about.html static/ js/ main.js css/ main.css
also you have create two html files with name of
about.html and put those files in
(Please note that the above accepted Answer provided for file/project structure is absolutely correct.)
In addition to properly setting up the project file structure, we have to tell flask to look in the appropriate level of the directory hierarchy.
app = Flask(__name__, template_folder='../templates')
app = Flask(__name__, template_folder='../templates', static_folder='../static')
../ moves one directory backwards and starts there.
../../ moves two directories backwards and starts there (and so on…).
Hope this helps
I don’t know why, but I had to use the following folder structure instead. I put “templates” one level up.
project/ app/ hello.py static/ main.css templates/ home.html venv/
This probably indicates a misconfiguration elsewhere, but I couldn’t figure out what that was and this worked.
If you run your code from an installed package, make sure template files are present in directory
In my case I was trying to run examples of project flask_simple_ui and
jinja would always say
The trick was that sample program would import installed package
ninja being used from inside that package is using as root directory for lookup the package path, in my case
...python/lib/site-packages/flask_simple_ui, instead of
os.getcwd() as one would expect.
To my bad luck,
setup.py has a bug and doesn’t copy any html files, including the missing
form.html. Once I fixed
setup.py, the problem with TemplateNotFound vanished.
I hope it helps someone.
- the template file has the right name
- the template file is in a subdirectory called
- the name you pass to
render_templateis relative to the template directory (
index.htmlwould be directly in the templates directory,
auth/login.htmlwould be under the auth directory in the templates directory.)
- you either do not have a subdirectory with the same name as your app, or the templates directory is inside that subdir.
If that doesn’t work, turn on debugging (
app.debug = True) which might help figure out what’s wrong.
I had the same error turns out the only thing i did wrong was to name my ‘templates’ folder,’template’ without ‘s’.
After changing that it worked fine,dont know why its a thing but it is.
You need to put all you
.html files in the template folder next to your python module. And if there are any images that you are using in your html files then you need put all your files in the folder named static
In the following Structure
project/ hello.py static/ image.jpg style.css templates/ homepage.html virtual/ filename.json
When render_template() function is used it tries to search for template in the folder called templates and it throws error jinja2.exceptions.TemplateNotFound when :
- the file does not exist or
- the templates folder does not exist
Create a folder with name templates in the same directory where the python file is located and place the html file created in the templates folder.
Another alternative is to set the
root_path which fixes the problem both for templates and static folders.
root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent app = Flask(__name__.split('.'), root_path=root_path)
If you render templates directly via
Jinja2, then you write:
ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates'))) template = ENV.get_template(your_template_name)
Another explanation I’ve figured out for myself
When you create the Flask application, the folder where
templates is looked for is the folder of the application according to name you’ve provided to Flask constructor:
app = Flask(__name__)
__name__ here is the name of the module where application is running. So the appropriate folder will become the root one for folders search.
projects/ yourproject/ app/ templates/
So if you provide instead some random name the root folder for the search will be current folder.