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