Signaux

Flask prend en charge les signaux utilisant [Blinker][1]. La prise en charge du signal est facultative ; ils ne seront activés que si Blinker est installé.

pip install blinker

http://flask.pocoo.org/docs/dev/signals/


Les signaux ne sont pas asynchrones. Lorsqu’un signal est envoyé, il exécute immédiatement chacune des fonctions connectées de manière séquentielle.

[1] : https://pythonhosted.org/blinker/

Connexion aux signaux

Utilisez la méthode “connect” d’un signal pour connecter une fonction à un signal. Lorsqu’un signal est envoyé, chaque fonction connectée est appelée avec l’expéditeur et tous les arguments nommés fournis par le signal.

from flask import template_rendered

def log_template(sender, template, context, **kwargs):
    sender.logger.info(
        'Rendered template %(template)r with context %(context)r.',
        template=template, context=context
    )

template_rendered.connect(log_template)

Voir la documentation sur les [signaux intégrés] [1] pour plus d’informations sur les arguments qu’ils fournissent. Un modèle utile consiste à ajouter un argument **kwargs pour intercepter tout argument inattendu.

[1] : http://flask.pocoo.org/docs/dev/api/#core-signals-list

Signaux personnalisés

Si vous voulez [créer et envoyer des signaux][1] dans votre propre code (par exemple, si vous écrivez une extension), créez une nouvelle instance Signal et appelez [send][2] lorsque les abonnés doivent être averti. Les signaux sont créés à l’aide d’un [Namespace][3].

from flask import current_app
from flask.signals import Namespace

namespace = Namespace()
message_sent = namespace.signal('mail_sent')

def message_response(recipient, body):
    ...
    message_sent.send(
        current_app._get_current_object(),
        recipient=recipient,
        body=body
    )

@message_sent.connect
def log_message(app, recipient, body):
    ...

Préférez utiliser le support de signal de Flask plutôt que d’utiliser Blinker directement. Il encapsule la bibliothèque afin que les signaux restent facultatifs si les développeurs utilisant votre extension n’ont pas choisi d’installer Blinker.

[1] : http://flask.pocoo.org/docs/dev/signals/#creating-signals [2] : https://pythonhosted.org/blinker/index.html#blinker.base.Signal.send [3] : http://flask.pocoo.org/docs/dev/api/#flask.signals.Namespace