Контекст приложения и контекст запроса

Продолжаем изучение пакета Flask и чтобы правильно понимать дальнейший материал, нам нужно разобраться с такими понятиями как контекст приложения и контекст запроса.

Когда сервер получает запрос от клиента, то сначала может быть создан контекст приложения, а затем обязательно создается контекст запроса, который и является фактически представлением (обработчиком) текущего запроса.

Зачем нужны эти контексты и какова их роль? Чаще всего они нужны для следующего. С контекстом приложения связаны две глобальные переменные: g и current_app. В первой сохраняется общая временная пользовательская информация, необходимая для обработки запросов. Например, мы собираемся из функций обращаться к БД. Тогда было бы правильно при появлении запроса установить соединение с БД и сохранить это соединение в какой-либо переменной, а после обработки запроса – закрыть соединение с БД. Как раз для хранения текущего активного соединения с БД хорошо подходит переменная g контекста приложения. Но, всегда нужно помнить, что как только обработка запроса завершается, данные в объекте g автоматически удаляются.

Вторая переменная (current_app) ссылается на контекст текущего приложения, которое было активизировано фреймворком Flask в ответ на текущий запрос. Зачем это вообще нужно? Разве мы создаем не одно приложение для одного сайта? В действительности не обязательно одно, Flask обеспечивает поддержку работы сразу нескольких WSGI-приложений. Например, в нашем пакете могут быть модули, в которых встречаются такие строчки:

app1 = Flask("app1")
app2 = Flask("app2")

В результате получаем два приложения и каждое отвечает за свой функционал сайта. Но у каждого приложения могут быть свои настройки и свои пути для хранения шаблонов и прочее. Чтобы встроенные функции Flask могли адекватно работать в условиях нескольких приложений, как раз и используется переменная current_app, которая ссылается на текущее приложение, активизированное для соответствующего запроса.

Однако, если фреймворк Flask видит, что мы в обработчике не собираемся использовать функционал контекста приложения, то оно не создается, чтобы не тратить процессорное время и ресурсы сервера.

А вот следующий контекст запроса создается всегда и обязательно после контекста приложения (если он применяется). С контекстом запроса связаны две другие глобальные переменные: request и session. Первый глобальный объект содержит данные, связанные с пришедшим запросом, включая текущий URL. Часто – это данные GET-запроса в формате: ключ-значение. Но, могут быть и более сложные, например, POST-запрос при загрузке файлов. Переменная request также доступна во всех функциях в пределах текущего потока (текущего представления), а также в шаблонах. И автоматически исчезает, когда обработка запроса завершается.

Переменная session – это словарь, в котором можно сохранять данные в пределах сессии. В отличие от других переменных, сессия сохраняется между запросами, но уникальна для каждого источника запроса. Например, некий пользователь авторизовался на сайте на странице login.html. Далее, когда он будет переходить на другие страницы сайта, мы должны «знать», что он уже авторизован и показывать ему соответствующую информацию. Вот как раз это можно сделать с помощью сессии: при авторизации сохранить данные, что он авторизован и при новом запросе от него проверять переменную session на предмет этой авторизации.

Разумеется, у любой сессии есть, так называемое, время жизни, спустя которое она очищается. Это время отсчитывается от последнего момента прихода соответствующего запроса. То есть, если наш пользователь долго не заходил на сайт, то ему придется авторизоваться еще раз.

Вот в двух словах, что представляют собой контекст приложения и запроса и для чего они служат. В дальнейшем, при изучении материала нам эта информация очень пригодится. Поэтому, если вы с ней ранее не были знакомы, то постарайтесь разобраться как все это работает.

Видео по теме