Flask-Signale-API

Flask verwendet die Blinker-Bibliothek, um Signale zu senden, wenn wichtige Ereignisse auftreten. Sie können sich mit diesen Signalen verbinden, um zusätzliche Protokollierung, Überwachung und andere Aktionen durchzuführen.

Signale sind keine Kernfunktion von Flask – die meisten Anforderungen können über Hooks (wie before_request) abgedeckt werden.


Zentrale Request-Signale

signal Auslösezeitpunkt Übergebene Parameter
request_started Nachdem der Anfragekontext eingerichtet wurde, vor der Vorverarbeitung sender=app
request_finished Nachdem die Antwort vollständig erstellt wurde, vor dem Senden sender=app, response
got_request_exception Während der Anfrage tritt eine nicht behandelte Ausnahme auf sender=app, exception
request_tearing_down Wenn der Request-Kontext zerstört wird (wird immer ausgeführt) sender=app, exc (optional)

Signale für den Anwendungskontext

signal Auslösezeitpunkt Übergebene Parameter
appcontext_pushed Wenn der Anwendungskontext auf den Stack gelegt wird sender=app
appcontext_popped Wenn der Anwendungskontext vom Stack entfernt wird sender=app
appcontext_tearing_down Wenn der Anwendungskontext zerstört wird (immer ausgeführt) sender=app, exc (optional)

Template- und Nachrichtensignale

signal Auslösezeitpunkt Übergebene Parameter
template_rendered Wenn das Rendern des Templates erfolgreich ist sender=app, template, context
before_render_template Vor dem Rendern des Templates sender=app, template, context
message_flashed Beim Aufruf von flash() sender=app, message, category

Möglichkeiten zum Verbinden von Signalen

Methode Beschreibung
signal.connect(func, app) Signale direkt verbinden. func empfängt sender und Schlüsselwortargumente.
signal.connect_via(app)(func) Dekoratorform. Verwendet automatisch app als sender.
with signal.connected_to(func, app): Kontextmanager. Temporäre Signalverbindung.

Codebeispiele

Beispiel

from flask import Flask, request_started, request_finished, template_rendered

app = Flask(__name__)

# Methode 1: Direkte Verbindung
def log_request_start(sender, **extra):
    print(f"Anfrage gestartet auf {sender.name}")

request_started.connect(log_request_start, app)

# Methode 2: Dekoratorverbindung
@request_finished.connect_via(app)
def log_request_end(sender, response, **extra):
    print(f"Anfrage mit Status {response.status_code} abgeschlossen")

# Methode 3: Template-Rendering-Signal
@template_rendered.connect_via(app)
def log_template(sender, template, context, **extra):
    print(f"Template gerendert: {template.name}")

# Methode 4: Ausnahmen abfangen
from flask import got_request_exception

def log_error(sender, exception, **extra):
    sender.logger.error(f"Ausnahme: {exception}")

got_request_exception.connect(log_error, app)
Weitere Erweiterungen