Home > Software engineering >  Template error while using Flask with blueprints
Template error while using Flask with blueprints

Time:02-03

I am getting a template not found error while trying to run a flask app using blueprints. The template directory is located at the root directory as expected at the same level as the app directory. I am not very sure why this is happening.

The directory structure

root/
  app/
    blueprint1/
      routes.py
    __main__.py
  templates/
      base.html
      index.html           

routes.py

from flask import Blueprint, render_template

blueprint = Blueprint(
    "blueprint", __name__, template_folder="templates")


@blueprint.route("/", methods=["GET", "POST"])
def index():
    return render_template("index.html")

Error

raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound: index.html

main.py


from flask import Flask

from app.blueprint1.routes import blueprint


def create_app():
    app = Flask(__name__)
    app.register_blueprint(blueprint)
    return app


def _main():
    daemon_app = create_app()
    daemon_app.run(debug=True)


if __name__ == "__main__":
    _main()

CodePudding user response:

Based on your file structure, your blueprint renders html files from the main template folder. It might work if you remove the template_folder argument from routes.py file.

I copied your codes and tried to emulate the error but it works for me. A year ago I have the same problem and somehow I solved it. Since I can't emulate the error I can't solve your problem.

Instead, I will just give you advise. You are making an effort to create blueprints in their own package, and yet you are using the main template folder. When you have a lot of blueprints managing the template folder will become a challenge. Thus, I recommend putting the html file within the blueprint package itself.

Here's the file structure:

root/
  app/
    blueprint1/
      pages/blueprint1/index.html
      routes.py
    __main__.py
  templates/
      base.html

and routes.py should be like this

blueprint = Blueprint(
    "blueprint", __name__, template_folder="pages")

@blueprint.route("/", methods=["GET", "POST"])
def index():
    return render_template("blueprint1/index.html")

CodePudding user response:

[Edited] This worked

routes.py

from flask import Blueprint, render_template

blueprint = Blueprint("blueprint", __name__, template_folder="../../templates")


@blueprint.route("/", methods=["GET", "POST"])
def index():
    return render_template("index.html")

__main__.py

from flask import Flask

from routes import blueprint


def create_app():
    app = Flask(__name__)
    app.register_blueprint(blueprint)
    return app


def _main():
    daemon_app = create_app()
    daemon_app.run(debug=True)


if __name__ == "__main__":
    _main()`
  •  Tags:  
  • Related