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)
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)