Событие request_tearing_down
Событие request_tearing_down относится к сигналам Flask и срабатывает каждый раз, когда завершается обработка запроса. В отличие от события request_finished, оно вызывается всегда - даже если во время обработки запроса возникло необработанное исключение. Сигнал относится к пространству имён flask. Первым параметром в подключённый обработчик передаётся объект приложения app, вторым - объект исключения exc, который равен None, если запрос завершился успешно. Событие удобно использовать для очистки ресурсов, закрытия соединений и освобождения памяти после обработки запроса.
Синтаксис
from flask import request_tearing_down
request_tearing_down.connect(receiver, app, [sender])
Пример
Давайте подключим обработчик к событию request_tearing_down и выведем сообщение в консоль при завершении запроса:
from flask import Flask, request_tearing_down
app = Flask(__name__)
def on_tearing_down(sender, exc, **extra):
print('request tearing down')
if exc is not None:
print('with exception')
request_tearing_down.connect(on_tearing_down, app)
@app.route('/')
def index():
return 'hello'
Результат выполнения кода при обращении к адресу '/':
request tearing down
Пример
Давайте проверим, что событие срабатывает даже при возникновении исключения в обработчике:
from flask import Flask, request_tearing_down
app = Flask(__name__)
def on_tearing_down(sender, exc, **extra):
if exc is not None:
print('error:', exc)
else:
print('ok')
request_tearing_down.connect(on_tearing_down, app)
@app.route('/')
def index():
raise ValueError('abcde')
Результат выполнения кода при обращении к адресу '/':
error: abcde
Пример
Давайте закроем соединение с базой данных в обработчике события, чтобы гарантировать освобождение ресурсов:
from flask import Flask, request_tearing_down
app = Flask(__name__)
class Database:
def __init__(self):
self.connected = True
def close(self):
self.connected = False
db = Database()
def on_tearing_down(sender, exc, **extra):
if db.connected:
db.close()
print('db closed')
request_tearing_down.connect(on_tearing_down, app)
@app.route('/')
def index():
return 'user'
Результат выполнения кода при обращении к адресу '/':
db closed
Смотрите также
-
класс
Signal,
который представляет собой сигнал во Flask -
метод
connect,
который подключает обработчик к сигналу -
событие
request_finished,
которое срабатывает при успешном завершении запроса -
событие
got_request_exception,
которое срабатывает при возникновении исключения в запросе