Шаг 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, будет разумным этого не делать.