Новинка версии 0.9
Одно из проектных решений Flask заключается в том, что есть два разных "состояния", в которых выполняется код. Состояние настройки приложения, которое подразумевается на уровне модуля. Оно наступает в момент, когда создаётся экземпляр объекта Flask, и заканчивается когда поступает первый запрос. Пока приложение находится в этом состоянии, верно следующее:
- программист может безопасно менять объект.
- запросы ещё не обрабатывались.
- у вас имеется ссылка на объект приложения, чтобы изменить его, нет необходимости пользоваться каким-либо посредником для того, чтобы получить ссылку на созданный или изменяемый объект приложения.
- пока активен запрос, объекты локального контекста (flask.request и другие) указывают на текущий запрос.
- любой код может в любое время может заполучить эти объекты.
Контекст приложения - это то, чем управляет локальный контекст 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.
Комментариев нет:
Отправить комментарий