.. _tutorial-dbcon: Шаг 4: Зарос соединения с базой данных -------------------------------------- Теперь мы знаем, как открыть соединение с базой данных, и использовать его для скриптов, но как это элегантно сдлелать для запросов? Нам будет необходимо соединение с базой данных во всех наших функциях, так что имеет смысл инициализировать его перед каждым запросом, а впоследствии закрывать его. Flask позволяет нам это сделать с помощью декораторов :meth:`~flask.Flask.before_request`, :meth:`~flask.Flask.after_request` и :meth:`~flask.Flask.teardown_request`:: @app.before_request def before_request(): g.db = connect_db() @app.teardown_request def teardown_request(exception): g.db.close() Функции с меткой :meth:`~flask.Flask.before_request` вызываются до запроса, им не передаётся аргументов. Функции с меткой :meth:`~flask.Flask.after_request` вызываются после запроса и им передаётся ответ, который будет послан клиенту. Они должны вернуть этот или другой объект ответа. Однако, нет гарантии их выполнения в случае возникновения ситуации исключения, в таких ситуациях приходит время для вызова функции :meth:`~flask.Flask.teardown_request`. Они вызываются после того, как ответ будет построен. Они не позволяют изменять запрос, а возвращаемые ими значения игнорируются. Если исключение появилось во время обработки запроса, оно передаётся каждой функции; в обратном случае ничего не передаётся ничего (`None`). Мы храним наши текущие соединения с базой данных в специальном объекте, которым нас снабдил Flask - :data:`~flask.g`. Этот объект сохраняет информацию только для одного запроса, и доступен изнутри каждой функции. Никогда не храните подобные вещи в других объектах, потому что это не будет работать в многопоточных окружениях. Для того, чтобы всё пошло как надо, этот особый объект - :data:`~flask.g` - производит за сценой определённые "магические" действия. Продолжение: :ref:`tutorial-views`. .. hint:: Куда мне поместить этот код? Если вы следовали указаниям этого учебника, вас может немного озадачить, куда поместить код из этого и следующего шага. Было бы логичным сгруппировать эти функции уровня модуля вместе, и разместить ваши новые функции ``before_request`` и ``teardown_request`` под функцией ``init_db`` (аккуратно следуя учебнику). Если вам нужно время, чтобы соориентироваться, взгляните как организованы `исходные тексты примера`_. В Flask, вы можете поместить весь код вашего приложения в единственный модуль Python. Однако это вовсе необязательно, и если ваше приложение :ref:`растёт larger `, будет разумным этого не делать. .. _исходные тексты примера: http://github.com/mitsuhiko/flask/tree/master/examples/flaskr/