Работа с командной оболочкой

Добавлено в версии 0.3.

Одна из причин, по которой все любят Python - это его командная оболочка. Она позволяет очень просто в реальном времени исполнять команды Python и получать немедленный результат. Сам по себе Flask не обладает интерактивной командной оболочкой, так как он не требует каких-либо особых предварительных настроек, а лишь импортирования вашего приложения и его старта с дальнейшими попытками «поиграться» с ним.

Однако, есть несколько удобных помощников для того, чтобы подобные действия в командной строке были бы более приятным занятием. Главная проблема при работе с сессией интерактивной консолью - это то, что вы не можете вызвать запрос, подобный тому, который делает браузер, а это означает, что g, request и другие недоступны. Однако код, который вы хотите проверить, может от них зависеть. Что же далать?

Здесь нам пригодятся несколько функций помощников. Однако, имейте в виду, что эти функции предназначены не только для использования с интерактивной командной оболочкой, но также и для тестирования модулей и для других ситуаций, требующих использования «поддельного» контекста запроса.

А вообще-то, вам рекомендуется сначала прочесть раздел документации Контекст запроса Flask.

Создание контекста запроса

Самый простой способ создать правильный контекст запроса из командной оболочки - это использование метода 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() автоматически вызываются при извлечении контекста. Поэтому, это отличное место для автоматического освобождения ресурсов, которые были нужны контексту запроса (например, соединения с базой данных).

Дальнейшее развитие опыта работы с командной оболочкой

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

Просто поместите их в модуль (например, shelltools), и импортируйте их оттуда:

>>> from shelltools import *

Оригинал этой страницы