Шаг 4: Зарос соединения с базой данных¶
Теперь мы знаем, как открыть соединение с базой данных, и использовать его для скриптов, но как это элегантно сдлелать для запросов? Нам будет необходимо соединение с базой данных во всех наших функциях, так что имеет смысл инициализировать его перед каждым запросом, а впоследствии закрывать его.
Flask позволяет нам это сделать с помощью декораторов
before_request()
, after_request()
и
teardown_request()
:
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
g.db.close()
Функции с меткой before_request()
вызываются до запроса,
им не передаётся аргументов. Функции с меткой
after_request()
вызываются после запроса и им передаётся
ответ, который будет послан клиенту. Они должны вернуть этот или другой
объект ответа. Однако, нет гарантии их выполнения в случае возникновения
ситуации исключения, в таких ситуациях приходит время для вызова функции
teardown_request()
. Они вызываются после того, как
ответ будет построен. Они не позволяют изменять запрос, а возвращаемые
ими значения игнорируются. Если исключение появилось во время обработки
запроса, оно передаётся каждой функции; в обратном случае ничего не
передаётся ничего (None).
Мы храним наши текущие соединения с базой данных в специальном объекте,
которым нас снабдил Flask - g
. Этот объект сохраняет
информацию только для одного запроса, и доступен изнутри каждой функции.
Никогда не храните подобные вещи в других объектах, потому что это не
будет работать в многопоточных окружениях. Для того, чтобы всё пошло
как надо, этот особый объект - g
- производит за сценой
определённые «магические» действия.
Продолжение: Шаг 5: Функции представления.
Подсказка
Куда мне поместить этот код?
Если вы следовали указаниям этого учебника, вас может немного озадачить,
куда поместить код из этого и следующего шага. Было бы логичным
сгруппировать эти функции уровня модуля вместе, и разместить ваши новые
функции before_request
и teardown_request
под функцией
init_db
(аккуратно следуя учебнику).
Если вам нужно время, чтобы соориентироваться, взгляните как организованы исходные тексты примера. В Flask, вы можете поместить весь код вашего приложения в единственный модуль Python. Однако это вовсе необязательно, и если ваше приложение растёт larger, будет разумным этого не делать.