Heim > Backend-Entwicklung > Python-Tutorial > Signalmechanismus im Flask-Framework von Python

Signalmechanismus im Flask-Framework von Python

高洛峰
Freigeben: 2017-03-03 13:27:16
Original
1399 Leute haben es durchsucht

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
Nach dem Login kopieren

Definieren Sie ein Signal:

from blinker import Namespace
product_saved = Namespace()
Nach dem Login kopieren

Sie können auch das von Flask umschlossene Einzelobjekt verwenden:

from flask.singles import Namespace
Nach dem Login kopieren

Signal senden

Das Senden eines Signals erfordert eine App-Instanzmethode. Das Beispiel lautet wie folgt:

product_saved.send(app, product=product)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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
Nach dem Login kopieren

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.
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage