Работа с оболочкой
Журнал изменений
В версии 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(), автоматически вызываются при извлечении контекста. Таким образом, это идеальное место для автоматического разбора ресурсов, необходимых для контекста запроса (например, подключений к базам данных).
Дальнейшее улучшение опыта работы с оболочкой
Если вам нравится идея экспериментировать в оболочке, создайте модуль с элементами, которые вы хотите импортировать в свою интерактивную сессию. Там вы также можете определить дополнительные вспомогательные методы для таких распространённых задач, как инициализация базы данных, удаление таблиц и т. д.
Просто поместите их в модуль (например, shelltools) и импортируйте оттуда:
>>> from shelltools import *
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.1.x/shell/