API des signaux Flask
Flask utilise la bibliothèque Blinker pour envoyer des signaux lorsque des événements clés se produisent. Vous pouvez vous connecter à ces signaux pour effectuer une journalisation, une surveillance et d'autres opérations supplémentaires.
Les signaux ne sont pas une fonctionnalité essentielle de Flask — la plupart des besoins peuvent être satisfaits au moyen de hooks (tels que before_request).
Signaux de requête principaux
| signal | Moment du déclenchement | Paramètres passés |
|---|---|---|
| request_started | Après l'établissement du contexte de requête, avant le prétraitement | sender=app |
| request_finished | Une fois la réponse entièrement construite, avant l'envoi | sender=app, response |
| got_request_exception | Une exception non gérée se produit pendant la requête | sender=app, exception |
| request_tearing_down | Lorsque le contexte de requête est détruit (toujours exécuté) | sender=app, exc (optionnel) |
Signaux du contexte d'application
| signal | Moment du déclenchement | Paramètres passés |
|---|---|---|
| appcontext_pushed | Lorsque le contexte d'application est empilé sur la pile | sender=app |
| appcontext_popped | Lorsque le contexte d'application est dépilé de la pile | sender=app |
| appcontext_tearing_down | Lorsque le contexte d'application est détruit (toujours exécuté) | sender=app, exc (optionnel) |
Signaux de template et de message
| signal | Moment du déclenchement | Paramètres passés |
|---|---|---|
| template_rendered | Lorsque le rendu du template réussit | sender=app, template, context |
| before_render_template | Avant le rendu du template | sender=app, template, context |
| message_flashed | Lors de l'appel à flash() | sender=app, message, category |
Façons de connecter les signaux
| Méthode | Description |
|---|---|
| signal.connect(func, app) | Connecter les signaux directement. func reçoit sender et des arguments nommés. |
| signal.connect_via(app)(func) | Forme de décorateur. Utilise automatiquement app comme sender. |
| with signal.connected_to(func, app): | Gestionnaire de contexte. Connexion temporaire du signal |
Exemples de code
Exemple
from flask import Flask, request_started, request_finished, template_rendered
app = Flask(__name__)
# Méthode 1 : Connexion directe
def log_request_start(sender, **extra):
print(f"Request started on {sender.name}")
request_started.connect(log_request_start, app)
# Méthode 2 : Connexion par décorateur
@request_finished.connect_via(app)
def log_request_end(sender, response, **extra):
print(f"Requête terminée avec le statut {response.status_code}")
# Méthode 3 : Signal de rendu de template
@template_rendered.connect_via(app)
def log_template(sender, template, context, **extra):
print(f"Template rendu : {template.name}")
# Méthode 4 : Intercepter les exceptions
from flask import got_request_exception
def log_error(sender, exception, **extra):
sender.logger.error(f"Exception : {exception}")
got_request_exception.connect(log_error, app)
app = Flask(__name__)
# Méthode 1 : Connexion directe
def log_request_start(sender, **extra):
print(f"Request started on {sender.name}")
request_started.connect(log_request_start, app)
# Méthode 2 : Connexion par décorateur
@request_finished.connect_via(app)
def log_request_end(sender, response, **extra):
print(f"Requête terminée avec le statut {response.status_code}")
# Méthode 3 : Signal de rendu de template
@template_rendered.connect_via(app)
def log_template(sender, template, context, **extra):
print(f"Template rendu : {template.name}")
# Méthode 4 : Intercepter les exceptions
from flask import got_request_exception
def log_error(sender, exception, **extra):
sender.logger.error(f"Exception : {exception}")
got_request_exception.connect(log_error, app)