複数のコマンドラインサブコマンドを使用するために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
を定義し、クリックでネストされたグループとして定義せずに、意図したとおりに機能させるために何をする必要がありますか?
助けてくれてありがとう!
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
助けてくれてありがとう グレイ・リー !
プロジェクトのルートの下に.flaskenv
という名前のファイルを作成し、このコンテンツをそのファイルに入れます。
FLASK_APP=fsksc.server.app:create_fsksc_app
次にpython-dotenvをインストールします。
$ pip install python-dotenv
これで、runコマンドを実行すると、env varが自動的に設定されます。