.. _shell: Работа с командной оболочкой ============================ .. versionadded:: 0.3 Одна из причин, по которой все любят Python - это его командная оболочка. Она позволяет очень просто в реальном времени исполнять команды Python и получать немедленный результат. Сам по себе Flask не обладает интерактивной командной оболочкой, так как он не требует каких-либо особых предварительных настроек, а лишь импортирования вашего приложения и его старта с дальнейшими попытками "поиграться" с ним. Однако, есть несколько удобных помощников для того, чтобы подобные действия в командной строке были бы более приятным занятием. Главная проблема при работе с сессией интерактивной консолью - это то, что вы не можете вызвать запрос, подобный тому, который делает браузер, а это означает, что :data:`~flask.g`, :data:`~flask.request` и другие недоступны. Однако код, который вы хотите проверить, может от них зависеть. Что же далать? Здесь нам пригодятся несколько функций помощников. Однако, имейте в виду, что эти функции предназначены не только для использования с интерактивной командной оболочкой, но также и для тестирования модулей и для других ситуаций, требующих использования "поддельного" контекста запроса. А вообще-то, вам рекомендуется сначала прочесть раздел документации :ref:`request-context`. Создание контекста запроса -------------------------- Самый простой способ создать правильный контекст запроса из командной оболочки - это использование метода :attr:`~flask.Flask.test_request_context`, который создаст нам :class:`~flask.ctx.RequestContext`: >>> ctx = app.test_request_context() Обычно, чтобы активировать этот объект запроса, вам следует использовать оператор `with`, но в командной оболочке проще вручную использовать методы :meth:`~flask.ctx.RequestContext.push` и :meth:`~flask.ctx.RequestContext.pop`: >>> ctx.push() С этого места и далее, вплоть до вызова `pop`, вы можете работать с объектом запроса. >>> ctx.pop() Формирование запроса до/после ----------------------------- Создавая лишь контекст запроса, нам не удаётся запустить код, который в реальной ситуации выполнится перед запросом. Из-за этого, к примеру, ваша база данных окажется недоступной, если соединение с ней шло через обратный вызов перед запросом, или к примеру текущий пользователь не будет сохранён в объекте :data:`~flask.g` и т. п. Это, Однако, можно сделать самостоятельно. Просто вызовите :meth:`~flask.Flask.preprocess_request`: >>> ctx = app.test_request_context() >>> ctx.push() >>> app.preprocess_request() Помните, что функция :meth:`~flask.Flask.preprocess_request` может вернуть объект ответа, в этом случае просто не обращайте на него внимания. Чтобы завершить ("выключить") запрос, вам необходимо немного поколдовать перед выполнением "после"-функций для запроса (вызываются с помощью :meth:`~flask.Flask.process_response`), которые воздействуют на объект ответа: >>> app.process_response(app.response_class()) >>> ctx.pop() Функции, зарегистрированные как :meth:`~flask.Flask.teardown_request` автоматически вызываются при извлечении контекста. Поэтому, это отличное место для автоматического освобождения ресурсов, которые были нужны контексту запроса (например, соединения с базой данных). Дальнейшее развитие опыта работы с командной оболочкой ------------------------------------------------------ Если вам понравилась идея экспериментировать в командной оболочке, создайте самостоятельно модуль с тем, что вам необходимо, чтобы он выполнил при своём импорте в вашу интерактивную сессию необходимую роль. Вам также следует определить ещё несколько методов-помощников для таких обычных задач, как инициализация базы данных, удаление таблиц и т. п. Просто поместите их в модуль (например, `shelltools`), и импортируйте их оттуда: >>> from shelltools import * `Оригинал этой страницы `_