flask: jinja2.exceptions.TemplateNotFound: index.html | Wie fixen?
Hallo zusammen,
nachdem ich jetzt Stunden, und zwar wirklich Stunden an nur einem, meiner Meinung nach unnötigem Problem gesessen habe, bitte ich nun um Hilfe.
Folgendes vorab: Nachdem ich die Datenbankkonfiguration ausgelagert habe, fing das Problem wieder an. Zuvor habe ich in die flask_app.py einfach folgendes eingetragen, was das Problem löste:
data = "Daten aus Python-Skript"
Ich persönlich arbeite mich ja in die Programmierung ein, habe aber das Gefühl, dass Flask irgendwie unnötig kompliziert ist. Aber das ist ja nicht wichtig.
Ich habe just for fun OpenAI mal über den Code laufen lassen: Zugegeben, ist das nicht die schlauste Option, aber nach 5 Stunden nur für diesen Code verzweifelt man doch etwas xD
Ich möchte Daten aus der Datenbank abrufen und auf der Webseite anzeigen lassen. Dazu existiert folgender Code:
Hauptverzeichnis/main.py:
from web.flask_app import app
from systm import main
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=5000) # 5000 Standard
Hauptverzeichnis/systm/main.py:
from flask import Flask, render_template
from systm.d import create_db_connection
app = Flask(__name__)
# Datenbankverbindung initialisieren
db = create_db_connection()
cursor = db.cursor()
@app.route('/')
def display_data():
# Hier können Sie Daten aus Ihrem Python-Skript abrufen
cursor.execute("SELECT * FROM products")
product_info = cursor.fetchall()
# Diese Daten werden an die HTML-Datei übergeben
return render_template('index.html', product_info=product_info)
# Route, um Produktinformationen anzuzeigen
@app.route('/products')
def display_products():
# Informationen aus der Datenbank abrufen
cursor.execute("SELECT * FROM products")
product_info = cursor.fetchall()
# Informationen an das HTML-Template übergeben und anzeigen
return render_template('products.html', product_info=product_info)
if __name__ == '__main__':
app.run(debug=True)
Hauptverzeichnis/systm/d.py:
import mysql.connector
def create_db_connection():
db = mysql.connector.connect(
host="",
user="",
password="",
database=""
)
return db
Hauptverzeichnis/web/flask_app.py:
from flask import Flask, render_template
from systm.d import create_db_connection
app = Flask(__name__, template_folder='web/templates', static_folder='web/static')
# Deaktivieren des Template-Caching
app.jinja_env.auto_reload = True
app.config['TEMPLATES_AUTO_RELOAD'] = True
app.config['STATIC_AUTO_RELOAD'] = True
# Datenbankverbindung initialisieren
db = create_db_connection()
cursor = db.cursor()
@app.route('/')
def display_data():
# Daten aus der Datenbank abrufen
cursor.execute("SELECT * FROM products")
product_info = cursor.fetchall()
# Diese Daten werden an die HTML-Datei übergeben und angezeigt
return render_template('index.html', product_info=product_info)
Hauptverzeichnis/web/templates/index.html :
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" type="style/css" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>Produktinformationen</h1>
<table>
<tr>
<th>Produktname</th>
<th>Verschlüsselungstyp</th>
<!-- Weitere Spalten hinzufügen -->
</tr>
{% for product in product_info %}
<tr>
<td>{{ product[0] }}</td>
<td>{{ product[1] }}</td>
<!-- Weitere Spalten hinzufügen -->
</tr>
{% endfor %}
</table>
</body>
</html>
1 Antwort
Die Pfadangabe für die Templates falsch.
Das ist deine aktuelle Ordnerstruktur:
/
main.py
/web
flask_app.py
/templates
index.html
/systm
d.py
main.py
In flask_app startest du die Flask-Anwendung, daher ist web auch das Rootverzeichnis für die Webapplikation. Nun gibst du an, dass ausgehend von dort die Templates unter web/templates liegen sollen, also unter /web/web/templates. Dieses Verzeichnis gibt es aber nicht.
Lass einfach die Angabe des Template-Ordners (und am besten ebenso des static-Ordners) komplett weg.
Die systm/main.py würde ich im Übrigen löschen, der Endpunkt für /products sollte in die flask_app.py.
Zuletzt noch eine Anmerkung zur Projektstruktur: Sofern die Anwendung klein und einfach bleibt (so wie aktuell bei dir), kann die von Flask vorgeschlagene Standardstruktur ruhig beibehalten werden. Für Projekte mit mehreren Modulen/vielen Routen macht eine Auffächerung Sinn (Beispiel 1, Beispiel 2 (siehe Punkt 3)).
Danke für deine Antwort!
Du meinst diese Zeile? Ja, welche sonst xD
"app = Flask(__name__, template_folder='web/templates', static_folder='web/static')" ?
Das habe ich so übernommen, wie es mir vorgeschlagen wurde. Als ich die db_connect nicht ausgelagert habe, hat es mit dem Pfad trotzdem funktioniert.
Die Ordnerstruktur habe ich selber angelegt, da es ein umfangreiches Projekt ist/wird. Ich wollte nur mit etwas anfangen, um A: wieder rein zu kommen, in die Programmierung und B: zu testen ob die Config funktioniert.
Bin davon ausgegangen, dass die Angabe dazu dient, dass die Zeile den korrekten Pfad verwendet. /web/templates/Index.html und nicht, dass es web als Standard schon gibt, da wie gesagt eigene Struktur und daraus /web/web/templates/index.html wird.
Teste ich später mal aus und lasse dich wissen, ob es funktioniert.
Danke nochmals! :)
Guten Abend. Ich habe es nun getestet, also das web-Verzeichnis entfernt und es funktioniert. Also:
zu:
Hinterfrage ich am besten nicht, warum es mir so vorgeschlagen wurde..
Danke für deine Hilfe!