Работа с оболочкой¶
Changelog
Добавлено в версии 0.3.
Одна из причин, по которой все любят Python, - это интерактивная оболочка. Она позволяет выполнять команды Python в реальном времени и немедленно получать результаты. Flask сам по себе не поставляется с интерактивной оболочкой, потому что он не требует никаких специальных настроек, просто импортируйте свое приложение и начинайте играть.
Однако есть несколько удобных помощников, которые сделают игру в оболочке более приятной. Основная проблема интерактивных консольных сессий заключается в том, что вы не запускаете запрос, как это делает браузер, а это значит, что g
, request
и другие недоступны. Но код, который вы хотите протестировать, может зависеть от них, так что же делать?
Здесь и пригодятся некоторые вспомогательные функции. Однако помните, что эти функции предназначены не только для интерактивного использования оболочки, но и для модульного тестирования и других ситуаций, когда требуется поддельный контекст запроса.
Обычно рекомендуется сначала прочитать Контекст запроса.
Интерфейс командной строки¶
Начиная с версии Flask 0.11, рекомендуемым способом работы с оболочкой является команда flask shell
, которая делает многое автоматически за вас. Например, оболочка автоматически инициализируется с загруженным контекстом приложения.
Для получения дополнительной информации смотрите Интерфейс командной строки.
Создание контекста запроса¶
Самый простой способ создать правильный контекст запроса из оболочки - это использовать метод test_request_context
, который создает нам RequestContext
:
>>> ctx = app.test_request_context()
Обычно вы используете оператор with
, чтобы сделать этот объект запроса активным, но в оболочке проще использовать методы push()
и pop()
вручную:
>>> ctx.push()
С этого момента вы можете работать с объектом запроса до тех пор, пока не вызовете pop:
>>> ctx.pop()
Увольнение до/после запроса¶
Просто создавая контекст запроса, вы все еще не запускаете код, который обычно выполняется перед запросом. Это может привести к тому, что ваша база данных будет недоступна, если вы подключаетесь к базе данных в обратном вызове перед запросом, или текущий пользователь не будет сохранен в объекте g
и т.д.
Однако это можно легко сделать самостоятельно. Просто позвоните по номеру preprocess_request()
:
>>> ctx = app.test_request_context()
>>> ctx.push()
>>> app.preprocess_request()
Имейте в виду, что функция preprocess_request()
может вернуть объект ответа, в этом случае просто проигнорируйте ее.
Чтобы выключить запрос, нужно немного схитрить, прежде чем функции после запроса (вызываемые process_response()
) начнут работать с объектом ответа:
>>> app.process_response(app.response_class())
<Response 0 bytes [200 OK]>
>>> ctx.pop()
Функции, зарегистрированные как teardown_request()
, автоматически вызываются при разрыве контекста. Таким образом, это идеальное место для автоматического разрушения ресурсов, которые были необходимы контексту запроса (например, соединения с базой данных).
Дальнейшее совершенствование опыта Shell¶
Если вам нравится идея экспериментировать в оболочке, создайте себе модуль с материалами, которые вы хотите импортировать в интерактивную сессию. Там же вы можете определить несколько вспомогательных методов для таких распространенных вещей, как инициализация базы данных, сброс таблиц и т.д.
Просто поместите их в модуль (например, shelltools) и импортируйте оттуда:
>>> from shelltools import *