Метод send_robust
Метод send_robust применяется к объекту сигнала
NamedSignal и отправляет его всем подключённым
получателям. В отличие от метода send, он не
прерывает выполнение при возникновении исключения
внутри получателя, а перехватывает его и продолжает
оповещение остальных подписчиков. Первым параметром
передаётся объект-отправитель, обычно это
current_app или app. Далее можно передать
произвольные именованные аргументы, которые будут
доступны получателям.
Синтаксис
signal.send_robust(sender, **kwargs)
Пример
Давайте создадим сигнал и подключим к нему два получателя, один из которых выбрасывает исключение:
from flask import Flask
from flask.signals import Namespace
app = Flask(__name__)
namespace = Namespace()
my_signal = namespace.signal('my-signal')
def receiver_one(sender, **kwargs):
print('receiver one')
def receiver_two(sender, **kwargs):
raise ValueError('error in receiver two')
def receiver_three(sender, **kwargs):
print('receiver three')
my_signal.connect(receiver_one)
my_signal.connect(receiver_two)
my_signal.connect(receiver_three)
res = my_signal.send_robust(app)
print(res)
Результат выполнения кода:
receiver one
receiver three
[(<function receiver_one at 0x...>, None), (<function receiver_two at 0x...>, ValueError('error in receiver two')), (<function receiver_three at 0x...>, None)]
Метод возвращает список кортежей. Первый элемент
кортежа - функция-получатель, второй - либо
None, если исключения не было, либо объект
исключения.
Пример
Давайте передадим дополнительные данные получателям через именованные аргументы:
from flask import Flask
from flask.signals import Namespace
app = Flask(__name__)
namespace = Namespace()
my_signal = namespace.signal('my-signal')
def receiver(sender, user, action, **kwargs):
print(f'{user} {action}')
my_signal.connect(receiver)
res = my_signal.send_robust(app, user='abcde', action='login')
print(res)
Результат выполнения кода:
abcde login
[(<function receiver at 0x...>, None)]
Смотрите также
-
класс
NamedSignal,
который представляет именованный сигнал -
метод
send,
который отправляет сигнал без перехвата исключений -
метод
connect,
который подключает получателя к сигналу -
метод
receivers_for,
который возвращает получателей для отправителя