web-dev-qa-db-ja.com

実行方法Flask app by flask runまたはカスタムコマンド、FLASK_APPを手動で設定せずに

使用事例

複数のコマンドラインサブコマンドを使用するためにclickグループを使用するpythonパッケージがあります。これに加えて、小さなflaskアプリケーションが欲しいです。

他のサブコマンドは、パッケージの主な機能です-flaskアプリケーションではありません。そのため、flaskコマンドを独自のグループの下にネストする必要があります。

私は私の問題を示すために最小限の例を作りました-それはここのGitHubにあります: https://github.com/ewels/flask-subcommand-issue

機能するもの

最小限の例では、fsksc_serverコマンドで実行されるミニflaskインストールをセットアップしました。これは、console_scriptsのsetuptools 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がスローされますが、サーバーは正常に動作しています。)

クリックサブコマンドでflaskコマンドを取得するには、flask add_commandをflaskグループで使用しました。このメインコマンドはfskscです。 flaskサブコマンドは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を定義し、クリックでネストされたグループとして定義せずに、意図したとおりに機能させるために何をする必要がありますか?

助けてくれてありがとう!

3
ewels

OK、そう Grey's answer 私を正しい軌道に乗せて..

残念ながら、flaskは.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

助けてくれてありがとう グレイ・リー

1
ewels

プロジェクトのルートの下に.flaskenvという名前のファイルを作成し、このコンテンツをそのファイルに入れます。

FLASK_APP=fsksc.server.app:create_fsksc_app

次にpython-dotenvをインストールします。

$ pip install python-dotenv

これで、runコマンドを実行すると、env varが自動的に設定されます。

2
Grey Li