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
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.
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.
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é.
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
Regarde ça:
templates
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.)Si cela ne fonctionne pas, activez le débogage (app.debug = True
) qui pourrait aider à comprendre ce qui ne va pas.
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.
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
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:
Résoudre le problème :
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)