Событие appcontext_tearing_down
Событие appcontext_tearing_down относится к сигналам
Flask и срабатывает, когда контекст приложения
начинает разрушаться. Это происходит при выходе
из блока with app.app_context или после
завершения обработки запроса, когда Flask
автоматически создавал контекст приложения.
Событие позволяет выполнить код очистки:
закрыть соединения с базой данных, освободить
ресурсы или сохранить промежуточные данные.
Обработчику передаётся аргумент exc -
исключение, из-за которого контекст разрушается,
или None, если разрушение проходит нормально.
Сигнал доступен через объект appcontext_tearing_down
из модуля flask. Подписка на событие
выполняется методом connect, а обработчик
получает первым аргументом объект отправителя
(обычно само приложение Flask), вторым -
значение exc.
Синтаксис
from flask import appcontext_tearing_down
appcontext_tearing_down.connect(handler, sender)
Пример
Давайте подпишемся на событие и выведем сообщение при разрушении контекста приложения:
from flask import Flask, appcontext_tearing_down
app = Flask(__name__)
def on_tearing_down(sender, exc):
print('app context tearing down')
print('exc:', exc)
appcontext_tearing_down.connect(on_tearing_down, app)
with app.app_context():
print('inside app context')
Результат выполнения кода:
"inside app context"
"app context tearing down"
"exc: None"
Пример
Давайте проверим, что при возникновении исключения
внутри контекста приложения обработчик получит
его в аргументе exc:
from flask import Flask, appcontext_tearing_down
app = Flask(__name__)
def on_tearing_down(sender, exc):
if exc is not None:
print('error:', exc)
else:
print('no error')
appcontext_tearing_down.connect(on_tearing_down, app)
try:
with app.app_context():
raise ValueError('abcde')
except ValueError:
pass
Результат выполнения кода:
"error: abcde"
Пример
Давайте используем событие для закрытия ресурса, открытого внутри контекста приложения:
from flask import Flask, appcontext_tearing_down
app = Flask(__name__)
resource = {'open': False}
def on_tearing_down(sender, exc):
if resource['open']:
resource['open'] = False
print('resource closed')
appcontext_tearing_down.connect(on_tearing_down, app)
with app.app_context():
resource['open'] = True
print('resource opened')
Результат выполнения кода:
"resource opened"
"resource closed"
Смотрите также
-
событие
appcontext_pushed,
которое срабатывает при создании контекста приложения -
событие
appcontext_popped,
которое срабатывает после разрушения контекста приложения -
событие
request_tearing_down,
которое срабатывает при разрушении контекста запроса -
метод
connect,
который подписывает обработчик на сигнал