Интерфейс командной строки¶
Установка Flask устанавливает скрипт flask
, интерфейс командной строки Click, в ваш virtualenv. Выполняемый из терминала, этот скрипт предоставляет доступ к встроенным командам, командам расширения и командам, определяемым приложением. Опция --help
предоставит дополнительную информацию о любых командах и опциях.
Обнаружение приложений¶
Команда flask
устанавливается Flask, а не вашим приложением; ей необходимо указать, где найти ваше приложение, чтобы использовать его. Опция --app
используется для указания способа загрузки приложения.
Хотя --app
поддерживает множество вариантов для указания вашего приложения, большинство случаев использования должны быть простыми. Вот типичные значения:
- (ничего)
Имя «app» или «wsgi» импортируется (как файл «.py» или пакет), автоматически определяя приложение (
app
илиapplication
) или фабрику (create_app
илиmake_app
).--app hello
Заданное имя импортируется, автоматически определяя приложение (
app
илиapplication
) или фабрику (create_app
илиmake_app
).
--app
состоит из трех частей: необязательный путь, задающий текущий рабочий каталог, путь к файлу Python или точечный путь импорта, и необязательное имя переменной экземпляра или фабрики. Если имя является фабрикой, за ним по желанию могут следовать аргументы в круглых скобках. Следующие значения демонстрируют эти части:
--app src/hello
Устанавливает текущий рабочий каталог в
src
, затем импортируетhello
.--app hello.web
Импортирует путь
hello.web
.--app hello:app2
Использует экземпляр колбы
app2
вhello
.--app 'hello:create_app("dev")'
Фабрика
create_app
вhello
вызывается со строкой'dev'
в качестве аргумента.
Если --app
не установлено, команда попытается импортировать «app» или «wsgi» (как файл «.py» или пакет) и попытается обнаружить экземпляр приложения или фабрику.
Внутри заданного импорта команда ищет экземпляр приложения с именем app
или application
, затем любой экземпляр приложения. Если экземпляр не найден, команда ищет фабричную функцию с именем create_app
или make_app
, которая возвращает экземпляр.
Если за именем фабрики следуют круглые скобки, их содержимое разбирается как литералы Python и передается в качестве аргументов и аргументов ключевых слов функции. Это означает, что строки должны быть заключены в кавычки.
Запустите сервер разработки¶
Команда run
запустит сервер разработки. В большинстве случаев она заменяет метод Flask.run()
.
$ flask --app hello run
* Serving Flask app "hello"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Предупреждение
Не используйте эту команду для запуска приложения в производстве. Используйте сервер разработки только во время разработки. Сервер разработки предоставляется для удобства, но не предназначен для обеспечения особой безопасности, стабильности или эффективности. О том, как запустить приложение в производстве, смотрите Развертывание в производство.
Если другая программа уже использует порт 5000, вы увидите OSError: [Errno 98]
или OSError: [WinError 10013]
при попытке запуска сервера. О том, как с этим справиться, смотрите Адрес уже используется.
Режим отладки¶
В режиме отладки команда flask run
по умолчанию включает интерактивный отладчик и перезагрузчик и облегчает просмотр и отладку ошибок. Чтобы включить режим отладки, используйте опцию --debug
.
$ flask --app hello run --debug
* Serving Flask app "hello"
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with inotify reloader
* Debugger is active!
* Debugger PIN: 223-456-919
Опцию --debug
можно также передать команде верхнего уровня flask
, чтобы включить режим отладки для любой команды. Следующие два вызова run
эквивалентны.
$ flask --app hello --debug run
$ flask --app hello run --debug
Наблюдение и игнорирование файлов с помощью перезагрузчика¶
При использовании режима отладки релоадер будет срабатывать всякий раз, когда изменится ваш код Python или импортированные модули. Перезагрузчик может следить за дополнительными файлами с помощью опции --extra-files
. Несколько путей разделяются с помощью :
, или ;
в Windows.
$ flask run --extra-files file1:dirA/file2:dirB/
* Running on http://127.0.0.1:8000/
* Detected change in '/path/to/file1', reloading
Перезагрузчик также может игнорировать файлы, использующие шаблоны fnmatch
, с помощью опции --exclude-patterns
. Несколько шаблонов разделяются с помощью :
, или ;
в Windows.
Открыть оболочку¶
Чтобы изучить данные в вашем приложении, вы можете запустить интерактивную оболочку Python с помощью команды shell
. Контекст приложения будет активен, а экземпляр приложения будет импортирован.
$ flask shell
Python 3.10.0 (default, Oct 27 2021, 06:59:51) [GCC 11.1.0] on linux
App: example [production]
Instance: /home/david/Projects/pallets/flask/instance
>>>
Используйте shell_context_processor()
для добавления других автоматических импортов.
Переменные среды из dotenv¶
Команда flask
поддерживает установку любого параметра для любой команды с помощью переменных окружения. Переменные именуются как FLASK_OPTION
или FLASK_COMMAND_OPTION
, например FLASK_APP
или FLASK_RUN_PORT
.
Вместо того чтобы передавать опции каждый раз, когда вы выполняете команду, или переменные окружения каждый раз, когда вы открываете новый терминал, вы можете использовать поддержку dotenv во Flask для автоматической установки переменных окружения.
Если установлен python-dotenv, выполнение команды flask
установит переменные окружения, определенные в файлах .env
и .flaskenv
. Вы также можете указать дополнительный файл для загрузки с помощью опции --env-file
. Файлы Dotenv можно использовать, чтобы избежать необходимости устанавливать --app
или FLASK_APP
вручную, а также для задания конфигурации с помощью переменных окружения, аналогично тому, как работают некоторые службы развертывания.
Переменные, заданные в командной строке, используются поверх переменных, заданных в .env
, которые используются поверх переменных, заданных в .flaskenv
. .flaskenv
следует использовать для публичных переменных, таких как FLASK_APP
, а .env
не следует фиксировать в вашем репозитории, чтобы он мог устанавливать приватные переменные.
Для поиска файлов каталоги сканируются вверх от каталога, из которого вы вызываете flask
.
Файлы загружаются только командой flask
или вызовом run()
. Если вы хотите загрузить эти файлы при работе в продакшене, вам следует вызвать load_dotenv()
вручную.
Настройка параметров команды¶
Click настроен на загрузку значений по умолчанию для опций команды из переменных окружения. Переменные используют шаблон FLASK_COMMAND_OPTION
. Например, чтобы задать порт для команды run, вместо flask run --port 8000
:
Bash
$ export FLASK_RUN_PORT=8000
$ flask run
* Running on http://127.0.0.1:8000/
Рыба
$ set -x FLASK_RUN_PORT 8000
$ flask run
* Running on http://127.0.0.1:8000/
CMD
> set FLASK_RUN_PORT=8000
> flask run
* Running on http://127.0.0.1:8000/
Powershell
> $env:FLASK_RUN_PORT = 8000
> flask run
* Running on http://127.0.0.1:8000/
Они могут быть добавлены в файл .flaskenv
так же, как и FLASK_APP
, для управления параметрами команд по умолчанию.
Отключить dotenv¶
Команда flask
выдаст сообщение, если обнаружит файлы dotenv, но python-dotenv не установлен.
$ flask run
* Tip: There are .env files present. Do "pip install python-dotenv" to use them.
Вы можете указать Flask не загружать файлы dotenv, даже если установлен python-dotenv, установив переменную окружения FLASK_SKIP_DOTENV
. Это может быть полезно, если вы хотите загрузить их вручную, или если вы используете запуск проекта, который уже загружает их. Помните, что переменные окружения должны быть установлены до загрузки приложения, иначе оно не будет настроено так, как ожидалось.
Bash
$ export FLASK_SKIP_DOTENV=1
$ flask run
Рыба
$ set -x FLASK_SKIP_DOTENV 1
$ flask run
CMD
> set FLASK_SKIP_DOTENV=1
> flask run
Powershell
> $env:FLASK_SKIP_DOTENV = 1
> flask run
Переменные среды из virtualenv¶
Если вы не хотите устанавливать поддержку dotenv, вы все равно можете установить переменные окружения, добавив их в конец скрипта virtualenv activate
. Активация virtualenv установит переменные.
Bash
Unix Bash, venv/bin/activate
:
$ export FLASK_APP=hello
Рыба
Рыбы, venv/bin/activate.fish
:
$ set -x FLASK_APP hello
CMD
Windows CMD, venv\Scripts\activate.bat
:
> set FLASK_APP=hello
Powershell
Windows Powershell, venv\Scripts\activate.ps1
:
> $env:FLASK_APP = "hello"
Предпочтительнее использовать поддержку dotenv, поскольку .flaskenv
можно зафиксировать в репозитории, чтобы он работал автоматически везде, где проверяется проект.
Пользовательские команды¶
Команда flask
реализована с помощью Click. Полную информацию о написании команд см. в документации этого проекта.
Этот пример добавляет команду create-user
, которая принимает аргумент name
.
import click
from flask import Flask
app = Flask(__name__)
@app.cli.command("create-user")
@click.argument("name")
def create_user(name):
...
$ flask create-user admin
Этот пример добавляет ту же команду, но в виде user create
, команду в группе. Это полезно, если вы хотите организовать несколько связанных команд.
import click
from flask import Flask
from flask.cli import AppGroup
app = Flask(__name__)
user_cli = AppGroup('user')
@user_cli.command('create')
@click.argument('name')
def create_user(name):
...
app.cli.add_command(user_cli)
$ flask user create demo
Обзор того, как тестировать пользовательские команды, см. в Выполнение команд с помощью программы CLI Runner.
Регистрация команд в чертежах¶
Если ваше приложение использует чертежи, вы можете зарегистрировать команды CLI непосредственно на них. Когда чертеж зарегистрирован в приложении, связанные с ним команды будут доступны команде flask
. По умолчанию эти команды будут вложены в группу, соответствующую имени чертежа.
from flask import Blueprint
bp = Blueprint('students', __name__)
@bp.cli.command('create')
@click.argument('name')
def create(name):
...
app.register_blueprint(bp)
$ flask students create alice
Вы можете изменить имя группы, указав параметр cli_group
при создании объекта Blueprint
или позже с помощью app.register_blueprint(bp, cli_group='...')
. Следующие параметры эквивалентны:
bp = Blueprint('students', __name__, cli_group='other')
# or
app.register_blueprint(bp, cli_group='other')
$ flask other create alice
Указание cli_group=None
удалит вложенность и объединит команды непосредственно на уровне приложения:
bp = Blueprint('students', __name__, cli_group=None)
# or
app.register_blueprint(bp, cli_group=None)
$ flask create alice
Контекст приложения¶
Команды, добавленные с помощью декоратора cli
или FlaskGroup
command()
приложения Flask, будут выполняться с подключенным контекстом приложения, поэтому ваши пользовательские команды и параметры имеют доступ к приложению и его конфигурации. Для получения такого же поведения можно использовать декоратор with_appcontext()
, но в большинстве случаев он не нужен.
import click
from flask.cli import with_appcontext
@click.command()
@with_appcontext
def do_work():
...
app.cli.add_command(do_work)
Плагины¶
Flask будет автоматически загружать команды, указанные в flask.commands
entry point. Это полезно для расширений, которые хотят добавить команды при установке. Точки входа указываются в setup.py
from setuptools import setup
setup(
name='flask-my-extension',
...,
entry_points={
'flask.commands': [
'my-command=flask_my_extension.commands:cli'
],
},
)
Внутри flask_my_extension/commands.py
можно экспортировать объект Click:
import click
@click.command()
def cli():
...
Когда этот пакет установлен в том же virtualenv, что и ваш проект Flask, вы можете выполнить flask my-command
для вызова команды.
Пользовательские сценарии¶
При использовании паттерна фабрики приложений может быть удобнее определить свой собственный сценарий Click. Вместо того чтобы использовать --app
и позволять Flask загружать ваше приложение, вы можете создать свой собственный объект Click и экспортировать его как точку входа console script.
Создайте экземпляр FlaskGroup
и передайте ему фабрику:
import click
from flask import Flask
from flask.cli import FlaskGroup
def create_app():
app = Flask('wiki')
# other setup
return app
@click.group(cls=FlaskGroup, create_app=create_app)
def cli():
"""Management script for the Wiki application."""
Определите точку входа в setup.py
:
from setuptools import setup
setup(
name='flask-my-extension',
...,
entry_points={
'console_scripts': [
'wiki=wiki:cli'
],
},
)
Установите приложение в virtualenv в редактируемом режиме, и пользовательский скрипт будет доступен. Обратите внимание, что вам не нужно устанавливать --app
.
$ pip install -e .
$ wiki run
Ошибки в пользовательских сценариях
При использовании пользовательского сценария, если вы внесете ошибку в код на уровне модуля, перезагрузчик выйдет из строя, поскольку он больше не сможет загрузить точку входа.
Команда flask
, будучи отделенной от вашего кода, не имеет этой проблемы и рекомендуется в большинстве случаев.
Интеграция PyCharm¶
PyCharm Professional предоставляет специальную конфигурацию запуска Flask для запуска сервера разработки. Для Community Edition, а также для других команд, кроме run
, вам необходимо создать собственную конфигурацию запуска. Эти инструкции должны быть аналогичными для любой другой IDE, которую вы используете.
В PyCharm, когда ваш проект открыт, нажмите на Run в строке меню и перейдите к Edit Configurations. Вы увидите окно, похожее на это:
Создав конфигурацию для flask run
, вы можете копировать и изменять ее для вызова любой другой команды.
Нажмите кнопку + (Добавить новую конфигурацию) и выберите Python. Дайте конфигурации имя, например «flask run».
Щелкните на выпадающем списке Путь к сценарию и измените его на Имя модуля, затем введите flask
.
В поле Параметры задается команда CLI для выполнения вместе с любыми аргументами. В данном примере используется --app hello run --debug
, которая запустит сервер разработки в режиме отладки. --app hello
должен быть импортом или файлом с вашим приложением Flask.
Если вы установили свой проект как пакет в virtualenv, вы можете снять флажок с опции PYTHONPATH. Это будет более точно соответствовать тому, как вы развернете проект позже.
Нажмите OK, чтобы сохранить и закрыть конфигурацию. Выберите конфигурацию в главном окне PyCharm и нажмите кнопку play рядом с ней, чтобы запустить сервер.
Теперь, когда у вас есть конфигурация для flask run
, вы можете скопировать ее и изменить аргумент Параметры, чтобы запустить другую команду CLI.