web-dev-qa-db-fra.com

Flask génère une erreur TemplateNotFound alors que le fichier de modèle existe

J'essaie de rendre le fichier home.html. Le fichier existe dans mon projet, mais je continue à obtenir jinja2.exceptions.TemplateNotFound: home.html quand j'essaye de le rendre. Pourquoi Flask ne trouve pas mon modèle?)

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('home.html')
/myproject
    app.py
    home.html
60
Srdan Ristic

Vous devez créer vos fichiers de modèle à l'emplacement correct. dans le sous-répertoire templates à côté de votre module python.

L'erreur indique qu'il n'y a pas de fichier home.html Dans le répertoire templates/. Assurez-vous que vous avez créé ce répertoire dans le même répertoire que votre module python, et que vous avez effectivement placé un fichier home.html Dans ce sous-répertoire. Si votre application est un package, le dossier des modèles doit être créé à l'intérieur du paquet.

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

Sinon, si vous avez nommé votre dossier de modèles avec un nom autre que templates et que vous ne voulez pas le renommer par défaut, vous pouvez indiquer à Flask d'utiliser cet autre répertoire.

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

Vous pouvez demander à Flask d'expliquer comment il a tenté de trouver un modèle donné en définissant l'option EXPLAIN_TEMPLATE_LOADING à True. Pour Chaque modèle chargé, un rapport sera consigné dans le fichier Flask app.logger , au niveau INFO.

Voici à quoi ressemble une recherche réussie. Dans cet exemple, le modèle foo/bar.html étend le modèle base.html. Il y a donc deux recherches:

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

Les plans peuvent aussi enregistrer leurs propres répertoires de modèles , mais cela n’est pas obligatoire si vous utilisez des plans pour faciliter le fractionnement d’un projet plus volumineux sur plusieurs unités logiques. Le répertoire principal du modèle d'application Flask) est toujours recherché en premier, même si vous utilisez des chemins d'accès supplémentaires par modèle.

133
Martijn Pieters

Je pense que Flask utilise les modèles de répertoire par défaut. Votre code doit donc être

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)

vous devez également créer deux fichiers HTML portant les noms home.html et about.html, puis les placer dans un dossier de modèles.

5
Akshay Karande

Je ne sais pas pourquoi, mais j'ai dû utiliser la structure de dossiers suivante. Je mets "modèles" un niveau supérieur.

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

Cela indique probablement une mauvaise configuration ailleurs, mais je ne pouvais pas comprendre ce que c'était et cela a fonctionné.

4
François Breton

Après avoir suivi ce fil et d’autres pour trouver une solution au même problème sans succès, j’ai trouvé une solution efficace pour mon projet actuel. (Veuillez noter que la réponse ci-dessus acceptée fournie pour la structure de fichier/projet va fonctionner dans la plupart des cas et est tout à fait correcte, je montre simplement ce qui a fonctionné spécifiquement pour moi.)

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

la même chose a fonctionné pour /static/style.css après avoir découvert que les fichiers .css n'étaient pas liés correctement aux fichiers .html ...

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

en plus de bien configurer la structure du projet, nous devons dire à flask) de regarder dans le niveau approprié de la hiérarchie des répertoires.

j'espère que ça aide

3
Rapid537

Regarde ça:

  1. le fichier modèle a le bon nom
  2. le fichier modèle se trouve dans un sous-répertoire appelé templates
  3. le nom que vous passez à render_template est relatif au répertoire du modèle (index.html serait directement dans le répertoire des modèles, auth/login.html serait sous le répertoire auth dans le répertoire templates.)
  4. soit vous ne disposez pas d'un sous-répertoire portant le même nom que votre application, soit le répertoire des modèles est à l'intérieur de ce sous-répertoire.

Si cela ne fonctionne pas, activez le débogage (app.debug = True) qui pourrait aider à comprendre ce qui ne va pas.

2
Eric

J'ai eu la même erreur s'est avéré que la seule chose que j'ai mal fait est de nommer mon dossier 'templates', 'template' sans 's'. Après avoir changé que cela a bien fonctionné, ne sais pas pourquoi c'est une chose mais c'est.

1
Shubham Khaire

Vous devez mettre tout vous .html fichiers dans le dossier modèle à côté de votre module python. Si des images que vous utilisez sont utilisées dans vos fichiers html, vous devez mettre tous vos fichiers dans le dossier nommé statique

Dans la structure suivante

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

Lorsque la fonction render_template () est utilisée, elle tente de rechercher un modèle dans le dossier appelé modèles et génère une erreur jinja2.exceptions.TemplateNotFound lorsque:

  1. le fichier html n'existe pas ou
  2. lorsque le dossier des modèles n'existe pas

Résoudre le problème :

créez un dossier avec les modèles de nom dans le même répertoire que le fichier python) et placez le fichier html créé dans le dossier des modèles.

0
Atal Kumar

Une autre alternative consiste à définir le root_path qui résout le problème à la fois pour les modèles et les dossiers statiques.

root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent
app = Flask(__name__.split('.')[0], root_path=root_path)

Si vous rendez les modèles directement via Jinja2, alors vous écrivez:

ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates')))
template = ENV.get_template(your_template_name)
0
Brut