Abschnitt 18 · Lektion 2
Die erste Route
Eine Anwendung mit einer einzigen Seite wird schnell langweilig. Das Haushaltsbuch soll eine Startseite haben, eine Seite für jede Kategorie, ein Formular für neue Ausgaben und noch mehr. Jede davon hat ihre eigene Adresse, und Flask muss wissen, welche Funktion zu welcher Adresse gehört.
Eine Route je Adresse
from flask import Flask
app = Flask(__name__)
@app.get("/")
def startseite():
return '<h1>Haushaltsbuch</h1><p><a href="/ueber">Was ist das hier?</a></p>'
@app.get("/ueber")
def ueber():
return '<h1>Über dieses Haushaltsbuch</h1><p><a href="/">Zurück</a></p>' Eine Route (route) ist genau diese Verbindung, eine Adresse und die Funktion, die sie
beantwortet. In der Datei stehen jetzt zwei davon. @app.get("/") hängt startseite() an den Pfad
/, die Wurzel der Anwendung, und @app.get("/ueber") hängt ueber() an /ueber.
Wenn eine Anfrage kommt, schaut Flask nach, zu welcher Route ihr Pfad passt, ruft die Funktion auf und schickt zurück, was sie zurückgibt. In welcher Reihenfolge die Routen in der Datei stehen, ist dabei egal.
Nach einem Klick auf den Link fragt der Browser /ueber, und die Adresse über der Seite wandert
mit. Ein Link ist in HTML ein <a>, und wohin er führt, steht in href. Ein Pfad, der mit /
anfängt, gilt von der Wurzel aus. href="/" führt also immer zur Startseite zurück, egal, wo man
gerade ist.
Den Namen der Funktion kannst du frei wählen. Mit der Adresse muss er nichts zu tun haben. Im Kurs
heißen die Funktionen trotzdem nach der Seite, startseite, ueber, kategorie, denn Flask merkt
sich jede Route unter diesem Namen. Beim Formular für neue Ausgaben wird er gebraucht, um aus dem
Namen wieder die Adresse zu machen.
Eine Adresse ohne Route
Wenn du /gibtesnicht in die Adresszeile tippst und Enter drückst, kommt Not Found mit dem
Statuscode 404 zurück, ganz ohne eigenen Code. Das macht Flask für jeden Pfad, zu dem keine
Route passt, von selbst.
Der zweite Befehl in der Befehlsleiste zeigt nur den Statuscode, ohne die Seite drumherum. Mit dem
ersten wird /ueber so gefragt wie vom Browser, nur wird keine Seite daraus gebaut, denn curl
zeigt das HTML einfach als Text.
Groß und klein zählt in einer Adresse übrigens. /Ueber ist eine andere Adresse als /ueber, und
darauf gibt es eine 404.
In älteren Anleitungen steht statt @app.get("/") oft @app.route("/"). Hier ist das dasselbe,
weil route ohne weitere Angabe nur Anfragen mit GET annimmt. Mit get steht es nur deutlicher da,
und mit dem Formular kommt post als Gegenstück dazu.
Anführungszeichen im HTML
from flask import Flask
app = Flask(__name__)
@app.get("/")
def startseite():
return "<h1>Haushaltsbuch</h1><p><a href="/ueber">Was ist das hier?</a></p>" HTML hat selbst Anführungszeichen, href="/ueber", und die beißen sich mit denen von Python. Hier
ist der Text nach <a href= zu Ende, weil dort das nächste doppelte Anführungszeichen steht. Was
dahinter kommt, versteht Python nicht mehr.
Der Server startet gar nicht erst. Im Terminal steht ein langer Traceback, der mit
SyntaxError: invalid syntax endet. So lang ist er, weil Flask deine Datei selbst importiert. Die
Zeilen aus flask/ und click/ sind der Weg dorthin, und deine Datei steht wie immer ganz unten.
Im Reiter Browser steht dazu, dass der Server nicht gestartet ist.
Wie es richtig geht, steht schon im ersten Beispiel. Der Python-Text steht in einfachen Anführungszeichen, und das HTML darin behält seine doppelten. Bei einem Text über mehrere Zeilen gehen auch drei doppelte Anführungszeichen wie in der Lektion davor. Darin dürfen einzelne doppelte stehen.
Zweimal derselbe Name
from flask import Flask
app = Flask(__name__)
@app.get("/")
def startseite():
return '<h1>Haushaltsbuch</h1><p><a href="/ueber">Was ist das hier?</a></p>'
@app.get("/ueber")
def startseite():
return '<h1>Über dieses Haushaltsbuch</h1><p><a href="/">Zurück</a></p>' Dieser Fehler passiert beim Kopieren. Die zweite Route ist eine Kopie der ersten, bei der Adresse
und Text angepasst sind, nur der Name der Funktion nicht. Flask will beide unter startseite
ablegen und bricht ab, schon beim Start. Die letzte Zeile des Tracebacks lautet:
AssertionError: View function mapping is overwriting an existing endpoint function: startseite
Übersetzt heißt das, die Zuordnung würde eine schon vorhandene Funktion namens startseite
überschreiben. Ein Endpunkt (endpoint) ist der Name, unter dem Flask eine Route kennt, und ohne
weitere Angabe ist das der Name der Funktion. Heißt die zweite Funktion ueber, startet der Server
wieder.
Was die Aufgabe will
Zwei Seiten des Haushaltsbuchs sollen aufeinander verweisen, eine Startseite und /ueber, und zwar
in beide Richtungen. Beim Prüfen wird dein Server dafür genauso gefragt wie vom Reiter Browser.
Zum Mitnehmen
Eine Route wie @app.get("/ueber") über def ueber() verbindet eine Adresse mit einer Funktion, die Flask bei jeder Anfrage an /ueber aufruft. Jede Route braucht eine Funktion mit eigenem Namen, sonst startet die Anwendung gar nicht. Seiten hängen über einen Link wie <a href="/ueber"> zusammen, und für eine Adresse ohne Route gibt es von selbst eine 404.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.