Шаг 3: Соединения с базой данных¶
Мы создали функцию для установления соединения с базой данных с помощью connect_db, но сама по себе она не совсем пригодна. Создание и закрытие соединения с базой данных каждый раз - очень неэффективно, поэтому мы хотели бы держать его подольше. Поскольку соединения с базой данных инкапсулирует транзакцию, нам также надо убедиться, что в один момент времени соединением пользуется только один запрос. В этом месте в игру вступает контекст приложения. С этого места и начнём.
Flask обеспечивает нас двумя контекстами: контекстом приложения и контекстом
запроса. На данный момент всё, что вы должны знать - это то, что есть
специальные переменные, которые используют их. Например, переменная
request
- это объект запроса, ассоциированный с текущим
запросом, в то время как g
- это переменная общего назначения,
которая ассоциирована с текущим контекстом приложения. Чуть позже мы
коснёмся этого более детально.
Всё, что вам надо знать на этот момент - это то, что вы можете безопасно
сохранять информацию в объекте g
.
Итак, когда же вы начнёте её туда сохранять? Чтобы сделать это, вы можете сделать функцию-помощник (helper). Когда она будет запущена в первый раз, она создаст для текущего контекста соединение с базой данных, и её успешные вызовы будут возвращать уже установленное соединение:
def get_db():
"""Если ещё нет соединения с базой данных, открыть новое - для
текущего контекста приложения
"""
if not hasattr(g, 'sqlite_db'):
g.sqlite_db = connect_db()
return g.sqlite_db
Итак, теперь мы знаем, как соединиться, но вот как мы можем соответственно
разорвать соединение? Для этого Flask обеспечил нас декоратором
teardown_appcontext()
. Он выполняется каждый раз,
когда происходит разрыв контекста приложения:
@app.teardown_appcontext
def close_db(error):
"""Closes the database again at the end of the request."""
if hasattr(g, 'sqlite_db'):
g.sqlite_db.close()
Функция, обозначенная как teardown_appcontext()
вызывается каждый раз при разрыве контекста приложения. Что это значит?
В сущности, контекст приложения уже создан до того, как пришёл запрос,
и он уничтожается (разрывается) когда запрос заканчивается. Разрыв
может произойти по двум причинам: или всё прошло хорошо (параметр
ошибки в этом случае будет None), или произошло исключение, и в этом
случае функции разрыва будет передана ошибка.
Непонятно, что означают эти контексты? Для дальнейшего изучения загляните в раздел документации Контекст приложения Flask.
Продолжение: Шаг 4: Создание базы данных.
Подсказка
Куда мне поместить этот код?
Если вы следовали указаниям этого учебника, вас может немного озадачить,
куда поместить код из этого и следующего шага. Было бы логичным
сгруппировать эти функции уровня модуля вместе, и разместить ваши новые
функции get_db
и close_db
под функцией
connect_db
(аккуратно следуя учебнику).
Если вам нужно время, чтобы сориентироваться, взгляните как организованы исходные тексты примера. В Flask, вы можете поместить весь код вашего приложения в единственный модуль Python. Однако это вовсе необязательно, и если ваше приложение растёт larger, будет разумным этого не делать.