Ein umfassendes Cheatsheet
Flask ist ein minimalistisches Web-Framework für Python. Es ist ideal, um schnell robuste und erweiterbare Webanwendungen zu erstellen.
Jede Flask-Anwendung benötigt eine Instanz der Flask-Klasse und mindestens eine "Route", um Anfragen zu bearbeiten.
from flask import Flask, render_template, request
# App konfigurieren
app = Flask(__name__)
# Eine "Route" definieren, die auf die URL "/" reagiert
@app.route("/")
def index():
# Rendert die HTML-Datei aus dem 'templates'-Ordner
return render_template("index.html")
Flask erwartet eine bestimmte Organisation Ihrer Dateien:
/meine_app
|-- app.py # Ihre Haupt-Python-Datei
|-- /templates
| |-- index.html # HTML-Dateien
| |-- layout.html
|-- /static
| |-- styles.css # CSS, JS, Bilder
Mit der Jinja2-Templating-Engine können Sie Python-ähnliche Logik direkt in Ihr HTML einbetten, um dynamische Seiten zu erstellen.
{{ ... }}: Für Ausdrücke. Gibt den Wert einer Variable oder eines Ausdrucks aus. Z.B.: <h1>Hallo, {{ name }}!</h1>{% ... %}: Für Anweisungen. Wird für Logik wie Schleifen oder Bedingungen verwendet.<ul>
{% for item in einkaufsliste %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% if user %}
<p>Willkommen, {{ user.name }}!</p>
{% else %}
<p>Bitte einloggen.</p>
{% endif %}
Vermeiden Sie Code-Wiederholung, indem Sie ein Basis-Layout definieren und Blöcke in anderen Templates überschreiben.
<!-- templates/layout.html -->
<!DOCTYPE html>
<html>
<head><title>Meine App</title></head>
<body>
{% block body %}{% endblock %}
</body>
</html>
<!-- templates/index.html -->
{% extends "layout.html" %}
{% block body %}
<h1>Das ist die Startseite!</h1>
{% endblock %}
Benutzereingaben werden typischerweise über HTML-Formulare gesammelt und mit GET- oder POST-Anfragen an den Server gesendet.
Importieren Sie das request-Objekt, um auf Formulardaten zuzugreifen. Die Route muss die erlaubten Methoden definieren.
from flask import request, redirect
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
# Daten aus dem Formular holen (bei POST)
username = request.form.get("username")
# Weiterleiten nach Verarbeitung
return redirect("/")
else:
# Formular bei GET-Anfrage anzeigen
return render_template("login.html")
Verwenden Sie request.form.get("name") für POST-Daten und request.args.get("name") für URL-Parameter (GET).
Sessions ermöglichen es, Informationen über mehrere Anfragen eines Benutzers hinweg zu speichern (z.B. wer eingeloggt ist). Sie basieren auf Cookies.
from flask import session
from flask_session import Session
# App konfigurieren, um dateisystembasierte Sessions zu nutzen
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
@app.route("/login", methods=["POST"])
def login():
# Nach erfolgreicher Anmeldung...
username = request.form.get("username")
session["user_id"] = username # Wert in der Session speichern
return redirect("/")
@app.route("/logout")
def logout():
session.clear() # Alle Daten aus der Session löschen
return redirect("/")
In anderen Routen können Sie dann mit if "user_id" in session: überprüfen, ob ein Benutzer angemeldet ist.
Die CS50-Bibliothek vereinfacht die Interaktion mit SQL-Datenbanken erheblich und schützt automatisch vor SQL-Injection.
from cs50 import SQL
# Datenbankverbindung herstellen
db = SQL("sqlite:///meinedatenbank.db")
# DATEN LESEN (SELECT)
# db.execute gibt eine Liste von Dictionaries zurück
users = db.execute("SELECT * FROM users WHERE status = ?", "active")
for user in users:
print(user["username"])
# DATEN SCHREIBEN (INSERT)
# WICHTIG: Immer Platzhalter (?) verwenden, um SQL-Injection zu verhindern!
username = request.form.get("username")
db.execute("INSERT INTO users (username) VALUES (?)", username)
? oder :name), die von db.execute bereitgestellt wird.