Работа с командной оболочкой¶
Добавлено в версии 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 *