Dies ist ein maschinell übersetzter Text, der Fehler enthalten kann!
Info
Der Großteil der Konfiguration stammt von hier: Flask Quickstart
GitHub?
Gerne können Sie den Code auf GitHub hochladen!
Schauen Sie in Teams nach Informationen zu GitHub Classroom, dort finden Sie einen Link zu einem Repository, das Sie als Startprojekt klonen können.
Ein bisschen Theorie 💤😴
Fun Fact: Warum heißt es Flask? 🤔
Ursprünglich war Flask nur ein Aprilscherz (it’s just a prank bro). Es war als Witz basierend auf einem bereits existierenden Framework namens “Bottle” gedacht, aber dann wurde es so beliebt, dass es in ein richtiges Framework umgewandelt wurde! (Quelle: Wikipedia)
Erstens, was ist Flask? Flask ist ein leichtgewichtiges Framework zum Erstellen von Webanwendungen. Obwohl es leichtgewichtig ist, bedeutet das nicht, dass es schlecht ist! Im Gegenteil, es ist tatsächlich das zweithäufigste Framework für Python im Bereich der Web-Frameworks. Den ersten Platz belegt Django.
Kurz gesagt: Flask gibt Ihnen die Möglichkeit, einen Webserver zu erstellen!
Als ihr letztes Jahr mit HTML/CSS/JavaScript gearbeitet habt, habt ihr die HTML-Seiten direkt im Browser „ausgeführt“. Entsprechend habt ihr beim Erstellen von Python-Programmen die Dateien einfach in VS Code ausgeführt.
Aber jetzt werden wir einen Webserver erstellen, also ein „Back-End“ (große Fachwörter, ich weiß 🤓). Dieser verwendet Python, um HTML-Webseiten an einen Benutzer „auszuliefern“.
Web-Server? Bereitstellung von Webseiten? Hä? 😭
Hast du dich jemals gefragt, was eigentlich passiert, wenn du zum Beispiel https://youtube.com aufrufst? Nein?
Stell dir vor, du gibst die Adresse einer Webseite in deinen Browser ein, wie erhältst du alle Informationen über den Inhalt, wie die Webseite aussieht und so weiter?
Die Antwort: ein Web-Server! 🖥️
Der Benutzer (also du) fragt nach der Anzeige von youtube.com. Daher sendest du eine “Request” an einen Web-Server und fragst:
- 📞 “Hallo, ich möchte gerne die YouTube-Webseite sehen, hast du sie für mich?”
- 🖥️ “Jaha, YouTube? Die schicke ich dir!” (cue sending a crapload of information)
- 📞 “Vielen Dank, ich sehe die Webseite!”
Warning
Dies ist keine exakte wissenschaftliche Erklärung.
Also, irgendetwas hat die Aufgabe, eine Webseite an den Benutzer zurückzusenden. Dort kommt der Web-Server, also die Flask-Anwendung, ins Spiel.
Teil 1 - Installation
PyCharm? Null problem!
Wenn du in PyCharm arbeitest, kannst du einfach den Projekttyp “Flask” finden und ein Projekt erstellen. Damit kannst du direkt zu Teil 2 springen. In anderen Code-Editoren musst du Flask wahrscheinlich manuell installieren. Es kann sich trotzdem lohnen, das hier zu lesen!
Öffne das Terminal. Überprüfe, ob die Kommandozeile auf den richtigen Ordner zeigt.
Gib im Terminal ein: pip install flask.
Dies installiert Flask auf deinem Rechner. pip install wird verwendet, wenn wir externe “Pakete” oder “Bibliotheken” installieren möchten.
Erstelle eine neue Datei mit dem Namen app.py. Platziere dann folgenden Code in dieser Datei:
# imports
from flask import Flask
# erstelle einen Flask-Server
app = Flask(__name__)
# wir erstellen eine "Route" für die Hauptseite, die "/" ist
@app.route("/")
def hello():
return "Hello World!"
# im Moment verwenden wir dies nur, um das Programm zu starten
if __name__ == "__main__":
app.run(debug=True)
Was macht dieser Code!?
Zuerst müssen wir Flask importieren. Wenn das bei Ihnen nicht funktioniert, haben Sie möglicherweise Schritt 2 falsch gemacht.
Danach müssen wir eine app erstellen, also einen “Webserver”, an den wir “Requests” senden können. Hier gibt es viele Fachbegriffe, aber das Wichtigste ist zu wissen, dass es sich um ein Programm handelt, das Daten senden und empfangen kann.
Info
Bitte nennen Sie die Variable für die App “app”. Sie können sie technisch gesehen nennen, wie Sie wollen, aber dann ist es nicht meine Schuld, wenn später etwas verwirrend wird! ☝️🤓
Danach haben wir eine Funktion mit einer “Route”. Dazu kommen wir später zurück. Aber eine Route ist nur etwas, das einige Informationen entgegennimmt und etwas anderes zurücksendet.
Zum Schluss führen wir die App mit app.run() aus. debug=True sagt Flask lediglich, dass es zusätzliche Protokollierung für Dinge ausgeben soll, die passieren, einschließlich Dinge, die schiefgehen. Wenn Sie eine Flask-App veröffentlichen möchten, denken Sie daran, auf debug=False zu ändern.
Führen Sie das Programm aus. Im Terminal sollten Sie einen Link sehen: http://127.0.0.1:5000. Folgen Sie diesem, entweder indem Sie darauf klicken oder ihn in den Browser eingeben, was erscheint?
Es passiert nichts!
- Haben Sie Schritt 2 ausgeführt?
- Haben Sie Python installiert?
Teil 2 - Einfache Routen
Nun, da wir eine grundlegende App haben, wollen wir uns mit dem ersten Flask-Konzept befassen: “Routen”!
“Route”, was ist das?
Eine “Route” oder eine “Richtung” ist ein Ort, an dem du auf einer Webseite hinfahren kannst. Zum Beispiel kannst du webseite.de/hilfe haben, dann ist “/hilfe” eine Route.
Aufgabe 1 - Basic Routes
Lasst uns eine einfache Route hinzufügen. Wir werden eine Route erstellen, die Ihnen einen Witz liefert, wenn Sie /joke in die Webseiten-URL eingeben.
Hier müssen wir ein neues Python-Konzept verwenden, das Sie noch nicht gesehen haben! Ein Decorator. Das ist eine spezielle Funktion, die die Funktionalität einer bereits existierenden Funktion modifiziert oder erweitert, ohne die Funktion selbst zu verändern.
Schauen Sie sich den folgenden Code an:
@app.route("/joke")
def joke():
# Dette er en enkel rute som returnerer en vits.
# Dies ist eine einfache Route, die einen Witz zurückgibt.
return "Why did the chicken cross the road? Buck if I know!"
Hier können Sie sehen, dass wir @app.route("/joke") hinzugefügt haben. Dieser Decorator teilt unserer app mit, dass diese Funktion eine route mit dem Wert /joke sein soll.
Fügen Sie diesen Code nach @app.route("/") hinzu. Versuchen Sie, den Code auszuführen, was passiert? Im Moment nichts! Aber alles, was Sie benötigen, um den fantastisch lustigen Witz abzurufen, ist die Eingabe von http://127.0.0.1:5000/joke. Damit haben Sie dem Webserver mitgeteilt, dass Sie von /joke abrufen möchten.
Lösung: Der gesamte Code bisher
# imports
from flask import Flask
# erstelle einen Flask-Server
app = Flask(__name__)
# wir erstellen eine "Route" für die Hauptseite, die "/" ist
@app.route("/")
def hello():
return "Hallo Welt!"
# neue Route, um einen Witz abzurufen
@app.route("/joke")
def joke():
return "Warum ist das Huhn über die Straße gegangen? Buck, wenn ich es wüsste!"
# im Moment verwenden wir dies nur, um das Programm zu starten
if __name__ == "__main__":
app.run(debug=True)
Wir werden uns später ansehen, wie wir ganze Webseiten über diese in Level 2 senden können.
Aufgabe 2 - Routen mit Parametern
Routen müssen nicht statisch sein. Wir können tatsächlich etwas aufrufen, das wir Parameter nennen, an die Routen übergeben.
Als Beispiel erstellen wir eine Route auf der Webseite, die den eingegebenen Namen begrüßt.
Schauen Sie sich den folgenden Code an:
@app.route("/hello/<name>")
def hello_name(name):
# Dette er en enkel rute som hilser på brukeren.
# Dies ist eine einfache Route, die den Benutzer begrüßt.
return "Hello " + name
Hier verwenden wir Klammern, um anzugeben, dass dies ein Parameter sein soll. <name> kann in diesem Fall alle möglichen Werte annehmen.
Fügen Sie diesen Code in app.py ein, führen Sie den Code aus, gehen Sie zum Browser und versuchen Sie Folgendes:
http://127.0.0.1:5000/hello/Bob.
Was passiert? Probieren Sie auch andere Namen aus!
Lösung: Der gesamte Code bisher
# imports
from flask import Flask
# erstelle einen Flask-Server
app = Flask(__name__)
# wir erstellen eine "Route" für die Hauptseite, die "/" ist
@app.route("/")
def hello():
return "Hallo Welt!"
# neue Route, um einen Witz abzurufen
@app.route("/joke")
def joke():
return "Warum ist das Huhn über die Straße gegangen? Buck, wenn ich es wüsste!"
# hallo zu dir!
@app.route("/hello/<name>")
def hello_name(name):
return "Hallo " + name
# im Moment verwenden wir dies nur, um das Programm zu starten
if __name__ == "__main__":
app.run(debug=True)
YouTube Beispiel
Wenn wir das YouTube-Beispiel von zuvor nehmen, kannst du dir vielleicht vorstellen, wie der Webserver weiß, welches Video du ansehen sollst.
Etwas vereinfacht sehen YouTube-Links wie folgt aus:
https://www.youtube.com/watch?v=<video_id>
Hierbei ist <video_id> ein Parameter, der dem Webserver mitteilt, welches Video er senden soll. Somit kümmert sich der Webserver um alles, was der Benutzer zurückerhalten möchte.
Aufgabe 3 - Parametertypen
Derzeit wird der Wert, wenn Sie einen Parameter mit <parameter> schreiben, immer als string-Typ, also Text, interpretiert.
Typen? Was ist das?
Typen sind etwas, über das wir bisher nicht viel gesprochen haben, aber das Wichtigste ist zu wissen, dass nicht alle Variablen auf die gleiche Weise funktionieren.
Stellen Sie sich vor, Sie werden gefragt, zwei Elefanten und das Wort “Apfel” zu addieren. Was wäre eigentlich die Antwort? Die Antwort ist, dass es nicht funktioniert, da es von Anfang an keinen Sinn ergibt!
In Python können wir das so sehen:
anzahl_elefanten = 2
frucht = "apfel"
print(anzahl_elefanten + frucht) # DAS GEHT NICHT!!
Warum funktioniert das nicht?!
Weil anzahl_elefanten und frucht zwei völlig unterschiedliche Typen sind. Der eine ist eine Zahl (integer oder int in Fachsprache), und der andere ist Text (string in Fachsprache). Wir können keine int und eine string addieren!
Routenparameter haben mehrere Eigenschaften. Wir können den “Typ” des Parameters angeben!
Schauen Sie sich den folgenden Code an:
@app.route("/calculate/<int:num>")
def calculate(num):
# Dette er en enkel rute som dobler et tall.
# Dies ist eine einfache Route, die eine Zahl verdoppelt.
return str(num * 2)
Dieser Code nimmt eine Zahl entgegen und multipliziert sie mit 2.
Fügen Sie diesen Code in app.py ein, führen Sie den Code aus, gehen Sie zum Browser und versuchen Sie Folgendes:
http://127.0.0.1:5000/calculate/3.
Welche Antwort erhalten Sie? Versuchen Sie auch andere Zahlen und sehen Sie, was passiert!
Lösung: Der gesamte Code bisher
# imports
from flask import Flask
# erstelle einen Flask-Server
app = Flask(__name__)
# wir erstellen eine "Route" für die Hauptseite, die "/" ist
@app.route("/")
def hello():
return "Hello World!"
# neue Route, um einen Witz abzurufen
@app.route("/joke")
def joke():
return "Why did the chicken cross the road? Buck if I know!"
# hallo zu dir!
@app.route("/hello/<name>")
def hello_name(name):
return "Hello " + name
# Rechner!
@app.route("/calculate/<int:num>")
def calculate(num):
return str(num * 2)
# im Moment verwenden wir dies nur, um das Programm zu starten
if __name__ == "__main__":
app.run(debug=True)
Über return und Flask
Du siehst vielleicht hier, dass wir return str(num * 2) schreiben.
Flask erwartet immer eine gültige HTTP-Antwort. Eine einfache Zahl ist keine gültige Antwort. Flask erwartet, einen string zurückzubekommen, also Text.
Extra über return und Flask
Du kannst hier auch einen Statuscode zurückgeben, aber das ist etwas, über das wir jetzt nicht sprechen werden. Das kannst du tun, indem du return "Hallo", 200 schreibst. 200 bedeutet einfach, dass alles gut gegangen ist und wie erwartet verlaufen ist. Wenn du dich mehr darüber informieren möchtest, was Statuscodes bedeuten, schau dir jetzt Wikipedia Status Codes an.
int Typen
Beachten Sie, dass hier <int:num> im Parameter steht.
Parameter können auf folgende Weise geschrieben werden: <type:name>. In diesem Code ist der Typ int, was Fachjargon für integer ist, also eine ganze Zahl.
Liste über Typen in Flask
| Typ | Was ist das? | Beispiele |
|---|---|---|
<string:name> | (Standard) aller Text außer / | "heisann", "Bob", "Kåre" |
<int:number> | Positive ganze Zahlen. | 2, 4, 47, 214 |
<float:decimal> | Dezimalzahlen (Fachbegriff: Gleitkommazahlen) | 2.4, 3.7, 44.213 |
<path:value> | Wie string, akzeptiert aber auch / | "heisann/hoppsann" |
<uuid:user_id> | Nimmt “UUID”-strings entgegen | 550e8400-e29b-41d4-a716-446655440000 |
Wichtig zu merken ist, dass der Name nach : alles sein kann.
Aufgabe 4 - Einfacher Rechner
Lassen Sie uns unsere calculate Route ein wenig verbessern! Sie können auch mehrere Parameter in einer Route einfügen! Versuchen Sie, zwei Parameter zur calculate Route hinzuzufügen, einen namens num1 und einen namens num2. Addieren Sie dann die Zahlen und geben Sie sie an die Webseite zurück.
Løsning
@app.route("/calculate/<int:num1>/<int:num2>")
def calculate(num1, num2):
return str(num1 + num2)
Aufgabe 5 - Erweiterter Taschenrechner
Zuletzt versuchen Sie, einen Taschenrechner zu erstellen, bei dem Sie +, -, *, / verwenden können.
Sie können entweder Wörter wie add, subtract oder Zeichen verwenden.
Versuchen Sie, es mit nur einer Route zu lösen! (Sie könnten def add(num1, num2) erstellen, aber hier geht es darum, dass Sie es mit nur def calculate tun).
Zusätzlich: Achten Sie darauf, dass die Division durch Null fehlschlägt.
Lösung
@app.route("/calculate/<int:num1>/<string:op>/<int:num2>")
def calculate(num1, op, num2):
if op == "add":
return str(num1 + num2)
elif op == "subtract":
return str(num1 - num2)
elif op == "multiply":
return str(num1 * num2)
elif op == "divide":
# Ekstra, kult hvis du husket dette! 😎
if num2 == 0:
return "Can't divide by zero!!"
return str(num1 / num2)
Lösung: Der gesamte Code
# imports
from flask import Flask
# erstelle einen Flask-Server
app = Flask(__name__)
# wir erstellen eine "Route" für die Hauptseite, die "/" ist
@app.route("/")
def hello():
return "Hello World!"
# neue Route, um einen Witz abzurufen
@app.route("/joke")
def joke():
return "Why did the chicken cross the road? Buck if I know!"
# hallo zu dir!
@app.route("/hello/<name>")
def hello_name(name):
return "Hello " + name
# Rechner!
@app.route("/calculate/<int:num1>/<string:op>/<int:num2>")
def calculate(num1, op, num2):
if op == "add":
return str(num1 + num2)
elif op == "subtract":
return str(num1 - num2)
elif op == "multiply":
return str(num1 * num2)
elif op == "divide":
# Extra, cool, wenn du dich daran erinnerst! 😎
if num2 == 0:
return "Can't divide by zero!!"
return str(num1 / num2)
# im Moment verwenden wir dies nur, um das Programm zu starten
if __name__ == "__main__":
app.run(debug=True)
Zusätzliche Aufgaben
Aufgabe E1 - Hallo hallo hallo hallo
Ändern Sie die /hello Route so, dass sie eine eindeutige Nachricht basierend darauf ausgibt, wer Hallo sagt.
Aufgabe E2 - Zufälliger Witz
Ändern Sie die /joke Route so, dass sie einen zufälligen Witz aus einer Liste von Witzen abruft. (Sie brauchen nicht viele, zeigen Sie nur, dass es funktioniert)
Aufgabe E3 - (Noch mehr) Erweiterter Taschenrechner
Fügen Sie Ihrem Taschenrechner noch weitere Funktionen hinzu, wie zum Beispiel Potenzieren, Sinus, Cosinus, Flächenberechner oder was Ihnen sonst noch einfällt.
Aufgabe E4 - Was ist der Sinn?
Erweitere die /joke Route noch weiter, um eine “Kategorie” von Witzen entgegennehmen zu können, wobei du /joke/<category> schreibst, um einen Witz dieser Art zu erhalten. Wenn du nur /joke schreibst, erhältst du einen zufälligen Witz aus jeder Kategorie.
Hint
Verwenden Sie entweder mehrere Listen (eine Liste pro Kategorie) oder ein Python-“Dictionary”. Lesen Sie hier mehr über Dictionaries: Python Dictionaries