Перевод статьи: The Application Context
Автор: Армин Роначер (Armin Ronacher)
Новинка версии 0.9
Одно из проектных решений Flask заключается в том, что есть два разных "состояния", в которых выполняется код. Состояние настройки приложения, которое подразумевается на уровне модуля. Оно наступает в момент, когда создаётся экземпляр объекта Flask, и заканчивается когда поступает первый запрос. Пока приложение находится в этом состоянии, верно следующее:
Напротив, во время обработки запроса верны следующие правила:
Есть и третье состояние, которое располагается между ними. Иногда можно работать с приложением так же, как и во время обработки запроса, просто в этот момент нет активного запроса. Например, вы можете работать с интерактивной оболочкой Python и взаимодействовать с приложением или запустить приложение из командной строки.
Контекст приложения - это то, чем управляет локальный контекст current_app.
Основная причина существования контекста приложений состоит в том, что в прошлом большая доля функциональности была привязана к контексту запроса за неимением лучшего решения. Тогда одной из целей, учитываемых при проектировании Flask, было обеспечение возможности иметь несколько приложений в рамках одного процесса Python.
Каким образом код находит "правильное" приложение? В прошлом мы рекомендовали явную передачу приложений, но появились проблемы с библиотеками, которые не были спроектированы с учётом этого.
Обходной путь решения этой проблемы заключался в том, чтобы использовать посредника current_app, привязанного ссылкой к текущему запросу приложения. Но поскольку создание такого контекста запроса является не оправданно дорогостоящим в случае отсутствия запроса, был введён контекст приложения.
Для создания контекста приложения есть два способа. Первый из них - неявный: когда поступает контекст запроса, при необходимости также создаётся и контекст приложения. В результате вы можете игнорировать существование контекста приложения до тех пор, пока он вам не понадобится.
Второй способ - это явное создание контекста при помощи метода app_context():
from flask import Flask, current_app app = Flask(__name__) with app.app_context(): # Внутри этого блока current_app указывает на app. print current_app.name
Контекст приложения также используется функцией url_for() в случае, если было настроено значение параметра конфигурации SERVER_NAME. Это позволяет вам генерировать URL'ы даже при отсутствии запроса.
Контекст приложения создаётся и уничтожается при необходимости. Он никогда не перемещается между потоками и не является общим для разных запросов. Поэтому - это идеальное место для хранения информации о подключении к базе данных и т.п. Внутренний объект стека называется flask._app_ctx_stack. Расширения могут хранить дополнительную информацию на самом верхнем уровне, если предполагается, что они выбрали достаточно уникальное имя.
За дополнительной информацией по теме обратитесь к разделу Разработка расширений Flask.
Этот и другие переводы можно найти на сайте проекта перевода документации по Flask. Автор проекта - Виталий Кузьмин aka ferm32.