Как запустить приложение Flask с помощью команды flask run или пользовательской команды без установки FLASK_APP вручную - PullRequest
2 голосов
/ 21 марта 2019

Вариант использования

У меня есть пакет python, использующий группу click для нескольких подкоманд командной строки. В дополнение к этому, я хотел бы иметь небольшую колбу.

Другие подкоманды являются основной функцией пакета - , а не приложение для колб. Таким образом, я бы хотел, чтобы команды колбы были вложены в их собственную группу.

Пример

Я сделал минимальный пример, чтобы продемонстрировать свою проблему - он здесь на GitHub: https://github.com/ewels/flask-subcommand-issue

Что работает

В минимальном примере я настроил установку мини-колбы, которая запускается командой fsksc_server. Это благодаря хуку точки входа setuptools console_scripts в setup.py.

Команда работает отлично, как и следовало ожидать:

$ fsksc_server --help

Usage: fsksc_server [OPTIONS] COMMAND [ARGS]...

  Run the fsksc server flask app

Options:
  --version  Show the flask version
  --help     Show this message and exit.

Commands:
  routes  Show the routes for the app.
  run     Runs a development server.
  shell   Runs a shell in the app context.
$ fsksc_server run

 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

(я не настроил никаких маршрутов, поэтому при посещении URL выдается 404, но сервер работает нормально ..)

Чтобы получить команды колбы в подкоманде click, я использовал колбу add_command с группой колб. Эта основная команда fsksc. Подкоманда колбы должна быть shell. Цель состоит в том, чтобы fsksc shell run запустить сервер разработки.

Команды отображаются правильно, поэтому эта часть, кажется, работает:

$ fsksc --help

Usage: fsksc [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  cmd1
  cmd2
  server  Run the fsksc server flask app

Что не работает

При выполнении каких-либо действий подкомандой server я получаю предупреждение об исключении NoAppException:

$ fsksc server --help

Traceback (most recent call last):
  File "/Users/ewels/miniconda2/envs/work/lib/python2.7/site-packages/Flask-1.0.2-py2.7.egg/flask/cli.py", line 529, in list_commands
    rv.update(info.load_app().cli.list_commands(ctx))
  File "/Users/ewels/miniconda2/envs/work/lib/python2.7/site-packages/Flask-1.0.2-py2.7.egg/flask/cli.py", line 384, in load_app
    'Could not locate a Flask application. You did not provide '
NoAppException: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
Usage: fsksc server [OPTIONS] COMMAND [ARGS]...

  Run the fsksc server flask app

Options:
  --version  Show the flask version
  --help     Show this message and exit.

Commands:
  routes  Show the routes for the app.
  run     Runs a development server.
  shell   Runs a shell in the app context.

Попытка запустить сервер дает похожую ошибку:

$ fsksc server run

 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
Usage: fsksc server run [OPTIONS]

Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.

Дрянной обходной путь

Я могу исправить это, правильно указав переменную окружения FLASK_APP. Тогда flask run работает как положено:

$ export FLASK_APP=/Users/ewels/GitHub/flask-subcommand-issue/fsksc/server/app.py:create_fsksc_app

$ fsksc server run

 * Serving Flask app "/Users/ewels/GitHub/flask-subcommand-issue/fsksc/server/app.py:create_fsksc_app"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

flask run тоже работает.

Но - Я не хочу, чтобы мои пользователи делали это! Я также не хочу загрязнять мою основную группу команд подкомандами flask (на самом деле у меня в подгруппе гораздо больше подкоманд).

Вопрос

Что мне нужно сделать, чтобы сделать эту работу, как я намереваюсь, без необходимости определять FLASK_APP и как вложенную группу в щелчке?

Заранее спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Создайте файл с именем .flaskenv в корневом каталоге вашего проекта, поместите в него следующее содержимое:

FLASK_APP=fsksc.server.app:create_fsksc_app

затем установите python-dotenv:

$ pip install python-dotenv

Теперь env var должен устанавливаться автоматически при выполнении команды run.

1 голос
/ 21 марта 2019

Хорошо, поэтому Ответ Грея поставил меня на правильный путь ..

К сожалению, из-за того, как колба использует файлы .flaskenv, пути должны быть либо абсолютными, либо относительнымив текущий рабочий каталог пользователя.Ни один из этих подходов не будет работать для других пользователей, устанавливающих пакет.

Однако, играя с этим, я обнаружил, что выполнение простого os.environ['FLASK_APP'] работает!Это просто должно быть очень рано в выполнении сценария.Тогда путь может быть установлен динамически в зависимости от местоположения установленного скрипта, и я думаю, что все работает:

flaskenv_app_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fsksc', 'server', 'app.py')
flaskenv_app_func = '{}:create_fsksc_app'.format(flaskenv_app_path)
os.environ['FLASK_APP'] = flaskenv_app_func

Я обновил минимальный пример кода следующим образом: https://github.com/ewels/flask-subcommand-issue

Спасибо за помощь Грей Ли !

...