Класс Namespace
Класс Namespace применяется для создания
отдельного пространства имён сигналов. Это
позволяет группировать события по категориям
и избегать пересечения имён между разными
библиотеками. Экземпляр класса хранит сигналы
как атрибуты, а доступ к ним осуществляется
через вызов метода signal.
При создании экземпляра первым параметром
передаётся имя пространства имён. Каждый
сигнал внутри пространства создаётся вызовом
метода signal с именем события.
Полученный сигнал можно соединять с
функциями-обработчиками через connect
и отправлять через send.
Синтаксис
from flask.signals import Namespace
ns = Namespace(name)
sig = ns.signal(name)
Пример
Давайте создадим пространство имён и один сигнал внутри него:
from flask import Flask
from flask.signals import Namespace
app = Flask(__name__)
ns = Namespace('myapp')
user_registered = ns.signal('user-registered')
def on_user_registered(sender, **extra):
return 'handler called'
user_registered.connect(on_user_registered, app)
@app.route('/')
def index():
res = user_registered.send(app)
return str(res)
Результат выполнения кода для адреса /:
[('handler called', None)]
Пример
Давайте создадим два сигнала в одном пространстве имён и соединим их с разными обработчиками:
from flask import Flask
from flask.signals import Namespace
app = Flask(__name__)
ns = Namespace('shop')
order_created = ns.signal('order-created')
order_paid = ns.signal('order-paid')
def on_order_created(sender, **extra):
return 'created'
def on_order_paid(sender, **extra):
return 'paid'
order_created.connect(on_order_created, app)
order_paid.connect(on_order_paid, app)
@app.route('/')
def index():
res1 = order_created.send(app)
res2 = order_paid.send(app)
return str(res1) + ' ' + str(res2)
Результат выполнения кода для адреса /:
[('created', None)] [('paid', None)]
Пример
Давайте передадим дополнительные данные вместе с сигналом через именованные аргументы:
from flask import Flask
from flask.signals import Namespace
app = Flask(__name__)
ns = Namespace('auth')
user_logged_in = ns.signal('user-logged-in')
def on_user_logged_in(sender, **extra):
return extra['username']
user_logged_in.connect(on_user_logged_in, app)
@app.route('/')
def index():
res = user_logged_in.send(app, username='abcde')
return str(res)
Результат выполнения кода для адреса /:
[('abcde', None)]