Ricerca…


Osservazioni

Flask supporta i segnali usando Blinker . Il supporto del segnale è facoltativo; saranno abilitati solo se Blinker è installato.

pip install blinker

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


I segnali non sono asincroni. Quando viene inviato un segnale, esegue immediatamente ciascuna delle funzioni collegate in sequenza.

Collegamento ai segnali

Utilizzare di un segnale connect metodo per collegare una funzione per un segnale. Quando viene inviato un segnale, ciascuna funzione connessa viene chiamata con il mittente e gli eventuali argomenti denominati forniti dal segnale.

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)

Vedere la documentazione sui segnali integrati per informazioni su quali argomenti forniscono. Un pattern utile è l'aggiunta di un argomento **kwargs per catturare qualsiasi argomento imprevisto.

Segnali personalizzati

Se si desidera creare e inviare segnali nel proprio codice (ad esempio, se si sta scrivendo un'estensione), creare una nuova istanza Signal e chiamare send quando gli abbonati devono essere avvisati. I segnali vengono creati utilizzando uno Namespace .

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

Preferisci usare il supporto del segnale di Flask sull'uso diretto di Blinker. Racchiude la libreria in modo che i segnali rimangano facoltativi se gli sviluppatori che utilizzano la tua estensione non hanno scelto di installare Blinker.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow