Flask stellt die Signalfunktion bereit, bei der es sich um einen Nachrichtenverteilungsmechanismus handelt. Ähnlich wie Hooks. Der Einsatz von Signalfunktionen kann die Programmkopplung reduzieren und komplexe Geschäftsmodelle zerlegen. Beispielsweise kann nach der Aktualisierung von Produktdaten ein Signal gesendet werden. Wenn eine Funktion Produktdaten verarbeiten muss, kann das Signal zur Verarbeitung erfasst werden. Sie müssen beispielsweise einen Produktcache erstellen oder den Suchindex aktualisieren usw.
Signale definieren
Die Flask-Signalfunktion verwendet das Blinkermodul, daher müssen Sie zuerst das Blinkermodul installieren
pip install blinker
Definieren Sie ein Signal:
from blinker import Namespace product_saved = Namespace()
Sie können auch das von Flask umschlossene Einzelobjekt verwenden:
from flask.singles import Namespace
Signal senden
Das Senden eines Signals erfordert eine App-Instanzmethode. Das Beispiel lautet wie folgt:
product_saved.send(app, product=product)
App kann Parameter hinzufügen, die später übergeben werden sollen, diese müssen jedoch im Format Name=Wert vorliegen und die Verwendung eines einzelnen Variablennamens wird nicht unterstützt .
Signal empfangen
Um ein Signal zu empfangen, können Sie die Decorator-Funktion connect_via verwenden:
@product_saved.connect_via(app) def updateCache(app, product): print(product)
Es gibt die folgenden Kernsignale in Flask:
1.flask.template_rendered
Dieses Signal wird gesendet, nachdem eine Vorlage erfolgreich ausgeführt wurde gerendert. Die vom Signal übergebene Vorlage ist eine Instanz der Vorlage, und der Kontext ist ein Umgebungsobjekt, das ein Wörterbuch ist.
Abonnementbeispiel:
def log_template_renders(sender, template, context, **extra): sender.logger.debug('Rendering template "%s" with context %s', template.name or 'string template', context) from flask import template_rendered template_rendered.connect(log_template_renders, app)
2.flask.request_started
Dieses Signal ist Wird gesendet, bevor die Anfrage startet und nachdem die Anfrageumgebung eingerichtet wurde. Da der Anforderungskontext bereits gebunden ist, können Abonnenten standardmäßige globale Proxys wie „request“ verwenden, um Anforderungen zu bearbeiten.
Abonnementbeispiel:
def log_request(sender, **extra): sender.logger.debug('Request context is set up') from flask import request_started request_started.connect(log_request, app) flask.request_finished
Dieses Signal wird gesendet, bevor eine Antwort an den Kunden gesendet wird. Die vom Signal übergebene Antwort ist die zu sendende Antwort.
Abonnementbeispiel:
def log_response(sender, response, **extra): sender.logger.debug('Request context is about to close down. ' 'Response: %s', response) from flask import request_finished request_finished.connect(log_response, app) flask.got_request_exception
Dieses Signal wird gesendet, wenn während der Anfrage eine Ausnahme auftritt. Es wird früher als bei der Standard-Ausnahmebehandlung gesendet. Im Debugging-Modus gibt es zwar keine Ausnahmebehandlung, dieses Signal wird jedoch auch beim Auftreten einer Ausnahme gesendet. Die vom Signal übergebene Ausnahme ist das Ausnahmeobjekt.
Abonnementbeispiel:
def log_exception(sender, exception, **extra): sender.logger.debug('Got exception during processing: %s', exception) from flask import got_request_exception got_request_exception.connect(log_exception, app) flask.request_tearing_down
Dieses Signal wird gesendet, wenn die Anfrage abstürzt, unabhängig davon, ob eine Ausnahme ausgelöst wird. Derzeit wird die Funktion, die auf dieses Signal wartet, nach dem allgemeinen Crash-Handler aufgerufen, es ist jedoch nichts verfügbar.
Beispiel für ein Abonnement:
def close_db_connection(sender, **extra): session.close()from flask import appcontext_tearing_down request_tearing_down.connect(close_db_connection, app)
In Flask Version 0.9 wird dadurch auch ein Schlüsselwortargument exc übergeben, wenn Wörter vorhanden sind. Dieser Parameter ist ein Verweis auf die Ausnahme, die den Absturz verursacht hat.
3.flask.appcontext_tearing_down
Senden Sie dieses Signal, wenn die Anwendungsumgebung abstürzt. Dieses Signal wird immer gesendet, auch bei einem durch eine Ausnahme verursachten Absturz. Funktionen, die auf dieses Signal warten, werden nach dem regulären Crash-Handler aufgerufen, Sie können jedoch nicht auf dieses Signal reagieren.
Beispiel für ein Abonnement:
def close_db_connection(sender, **extra): session.close()from flask import request_tearing_down appcontext_tearing_down.connect(close_db_connection, app)
Dabei wird auch ein exc-Schlüsselwortargument übergeben, sofern eines vorhanden ist. Dieser Parameter ist ein Verweis auf die Ausnahme, die den Absturz verursacht hat.
4.flask.appcontext_pushed
Wenn der Kontext einer Anwendung gepusht wird, sendet die Anwendung dieses Signal. Dieses Signal wird normalerweise in Unit-Tests verwendet, um Informationen vorübergehend einzubinden. Beispielsweise können damit vorhandene Ressourcen im g-Objekt geändert werden.
Verwendungsbeispiel:
from contextlib import contextmanagerfrom flask import appcontext_pushed @contextmanagerdef user_set(app, user): def handler(sender, **kwargs): g.user = user with appcontext_pushed.connected_to(handler, app): yield
Schreiben Sie so im Testcode:
def test_user_me(self): with user_set(app, 'john'): c = app.test_client() resp = c.get('/users/me') assert resp.data == 'username=john' New in version 0.10.
5.appcontext_popped
Wenn der Kontext einer Anwendung geöffnet wird, sendet die Anwendung dieses Signal. Dieses Signal wird normalerweise als appcontext_tearing_down-Signal geschrieben.
6.flask.message_flashed
Dieses Signal wird ausgegeben, wenn die Anwendung eine Nachricht blinkt. Der Parameter „message“ ist der Nachrichteninhalt und der Parameter „category“ ist die Nachrichtenkategorie.
Abonnementbeispiel:
recorded = []def record(sender, message, category, **extra): recorded.append((message, category)) from flask import message_flashed message_flashed.connect(record, app)
Zusammenfassung
Signale können Sie in kürzester Zeit ans Ziel bringen flash Abonnieren Sie sie sicher. Diese temporären Abonnements sind beispielsweise zum Testen nützlich. Lassen Sie bei der Verwendung von Signalen keine Ausnahmen bei Signalteilnehmern (Empfängern) zu, da Ausnahmen zu Programmunterbrechungen führen.
Weitere Artikel zum Signalmechanismus im Flask-Framework von Python finden Sie auf der chinesischen PHP-Website!