Работа с оболочкой

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 *
Вернуться на верх