コマンドラインインターフェイス
Flaskをインストールすると、flask
スクリプト、 Click コマンドラインインターフェイスがvirtualenvにインストールされます。 このスクリプトは端末から実行され、組み込み、拡張、およびアプリケーション定義のコマンドへのアクセスを提供します。 --help
オプションは、コマンドとオプションに関する詳細情報を提供します。
アプリケーションの発見
flask
コマンドは、アプリケーションではなく、Flaskによってインストールされます。 アプリケーションを使用するには、アプリケーションの場所を指定する必要があります。 FLASK_APP
環境変数は、アプリケーションのロード方法を指定するために使用されます。
Unix Bash(Linux、Macなど):
$ export FLASK_APP=hello
$ flask run
Windows CMD:
> set FLASK_APP=hello
> flask run
Windows PowerShell:
> $env:FLASK_APP = "hello"
> flask run
FLASK_APP
は、アプリケーションを指定するためのさまざまなオプションをサポートしていますが、ほとんどのユースケースは単純である必要があります。 典型的な値は次のとおりです。
- (なし)
- ファイル
wsgi.py
がインポートされ、アプリ(app
)が自動的に検出されます。 これにより、追加の引数を使用してファクトリからアプリを簡単に作成できます。 FLASK_APP=hello
- 名前がインポートされ、アプリ(
app
)またはファクトリ(create_app
)が自動的に検出されます。
FLASK_APP
には、現在の作業ディレクトリを設定するオプションのパス、Pythonファイルまたはドット付きインポートパス、およびインスタンスまたはファクトリのオプションの変数名の3つの部分があります。 名前がファクトリの場合、オプションで括弧内に引数を続けることができます。 次の値は、これらの部分を示しています。
FLASK_APP=src/hello
- 現在の作業ディレクトリを
src
に設定してから、hello
をインポートします。 FLASK_APP=hello.web
- パス
hello.web
をインポートします。 FLASK_APP=hello:app2
hello
のapp2
Flaskインスタンスを使用します。FLASK_APP="hello:create_app('dev')"
hello
のcreate_app
ファクトリは、引数として文字列'dev'
を使用して呼び出されます。
FLASK_APP
が設定されていない場合、コマンドは「app」または「wsgi」を(「.py」ファイルまたはパッケージとして)インポートし、アプリケーションインスタンスまたはファクトリを検出しようとします。
指定されたインポート内で、コマンドはapp
またはapplication
という名前のアプリケーションインスタンスを検索し、次に任意のアプリケーションインスタンスを検索します。 インスタンスが見つからない場合、コマンドはインスタンスを返すcreate_app
またはmake_app
という名前のファクトリ関数を探します。
アプリケーションファクトリを呼び出すときに、ファクトリがinfo
という名前の引数を取ると、ScriptInfo
インスタンスがキーワード引数として渡されます。 括弧がファクトリ名の後に続く場合、その内容はPythonリテラルとして解析され、引数として関数に渡されます。 これは、文字列が引き続き引用符で囲まれている必要があることを意味します。
開発サーバーを実行する
run
コマンドは、開発サーバーを起動します。 ほとんどの場合、Flask.run()
メソッドに置き換わります。
$ flask run
* Serving Flask app "hello"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
警告
このコマンドを使用して、アプリケーションを本番環境で実行しないでください。 開発中のみ開発サーバーを使用してください。 開発サーバーは便宜上提供されていますが、特に安全、安定、または効率的になるようには設計されていません。 本番環境での実行方法については、導入オプションを参照してください。
シェルを開く
アプリケーションのデータを探索するには、shell
コマンドを使用してインタラクティブなPythonシェルを起動できます。 アプリケーションコンテキストがアクティブになり、アプリインスタンスがインポートされます。
$ flask shell
Python 3.6.2 (default, Jul 20 2017, 03:52:27)
[GCC 7.1.1 20170630] on linux
App: example
Instance: /home/user/Projects/hello/instance
>>>
shell_context_processor()
を使用して、他の自動インポートを追加します。
環境
バージョン1.0の新機能。
Flaskアプリが実行される環境は、 FLASK_ENV
環境変数によって設定されます。 設定されていない場合、デフォルトでproduction
になります。 他に認識されている環境はdevelopment
です。 Flaskと拡張機能は、環境に基づいて動作を有効にすることを選択できます。
envがdevelopment
に設定されている場合、flask
コマンドはデバッグモードを有効にし、flask run
は対話型デバッガーとリローダーを有効にします。
$ FLASK_ENV=development flask run
* Serving Flask app "hello"
* Environment: development
* 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
デバッグモード
上記のように、 FLASK_ENV
がdevelopment
の場合、デバッグモードが有効になります。 デバッグモードを個別に制御する場合は、 FLASK_DEBUG
を使用してください。 値1
はそれを有効にし、0
はそれを無効にします。
dotenvからの環境変数
新しい端末を開くたびにFLASK_APP
を設定するのではなく、Flaskのdotenvサポートを使用して環境変数を自動的に設定できます。
python-dotenv がインストールされている場合、flask
コマンドを実行すると、ファイル.env
および.flaskenv
で定義されている環境変数が設定されます。 これを使用すると、新しい端末を開くたびにFLASK_APP
を手動で設定する必要がなくなり、一部の展開サービスの動作と同様の環境変数を使用して構成を設定できます。
コマンドラインで設定された変数は、.env
で設定された変数に対して使用され、.flaskenv
で設定された変数に対して使用されます。 .flaskenv
は、FLASK_APP
などのパブリック変数に使用する必要がありますが、.env
は、プライベート変数を設定できるようにリポジトリにコミットしないでください。
ディレクトリは、flask
と呼ばれるディレクトリから上向きにスキャンされ、ファイルが検索されます。 現在の作業ディレクトリは、それが最上位のプロジェクトディレクトリであると想定して、ファイルの場所に設定されます。
ファイルは、flask
コマンドまたはrun()
の呼び出しによってのみロードされます。 本番環境で実行しているときにこれらのファイルをロードする場合は、load_dotenv()
を手動で呼び出す必要があります。
コマンドオプションの設定
Clickは、環境変数からコマンドオプションのデフォルト値をロードするように構成されています。 変数はパターンFLASK_COMMAND_OPTION
を使用します。 たとえば、flask run --port 8000
の代わりに、実行コマンドのポートを設定するには、次のようにします。
$ export FLASK_RUN_PORT=8000
$ flask run
* Running on http://127.0.0.1:8000/
これらをFLASK_APP
と同じように.flaskenv
ファイルに追加して、デフォルトのコマンドオプションを制御できます。
dotenvを無効にする
flask
コマンドは、dotenvファイルを検出したが、python-dotenvがインストールされていない場合、メッセージを表示します。
$ flask run
* Tip: There are .env files present. Do "pip install python-dotenv" to use them.
FLASK_SKIP_DOTENV
環境変数を設定することで、python-dotenvがインストールされている場合でもdotenvファイルをロードしないようにFlaskに指示できます。 これは、手動でロードする場合、またはすでにロードしているプロジェクトランナーを使用している場合に役立ちます。 アプリが読み込まれる前に環境変数を設定する必要があることに注意してください。設定しないと、期待どおりに構成されません。
$ export FLASK_SKIP_DOTENV=1
$ flask run
virtualenvからの環境変数
dotenvサポートをインストールしたくない場合でも、virtualenvのactivate
スクリプトの最後に追加することで、環境変数を設定できます。 virtualenvをアクティブにすると、変数が設定されます。
Unix Bash、venv/bin/activate
:
$ export FLASK_APP=hello
Windows CMD、venv\Scripts\activate.bat
:
> set FLASK_APP=hello
.flaskenv
はリポジトリにコミットできるため、プロジェクトがチェックアウトされている場所ならどこでも自動的に機能するため、これよりもdotenvサポートを使用することをお勧めします。
カスタムコマンド
flask
コマンドは、 Click を使用して実装されます。 コマンドの記述に関する完全な情報については、そのプロジェクトのドキュメントを参照してください。
この例では、引数name
を受け取るコマンドcreate-user
を追加します。
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コマンドのテストを参照してください。
アプリケーションコンテキスト
Flaskアプリのcli
command()
デコレーターを使用して追加されたコマンドは、アプリケーションコンテキストがプッシュされた状態で実行されるため、コマンドと拡張機能はアプリとその構成にアクセスできます。 Flaskデコレータの代わりにClick command()
デコレータを使用してコマンドを作成する場合、with_appcontext()
を使用して同じ動作を得ることができます。
import click
from flask.cli import with_appcontext
@click.command()
@with_appcontext
def do_work():
...
app.cli.add_command(do_work)
コマンドにコンテキストが必要ないことが確実な場合は、次のように無効にすることができます。
@app.cli.command(with_appcontext=False)
def do_work():
...
プラグイン
Flaskは、flask.commands
エントリポイントで指定されたコマンドを自動的にロードします。 これは、インストール時にコマンドを追加する拡張機能に役立ちます。 エントリポイントは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():
...
そのパッケージがFlaskプロジェクトと同じvirtualenvにインストールされたら、flask my-command
を実行してコマンドを呼び出すことができます。
カスタムスクリプト
アプリのファクトリパターンを使用している場合は、独自のClickスクリプトを定義する方が便利な場合があります。 FLASK_APP
を使用してFlaskにアプリケーションをロードさせる代わりに、独自のClickオブジェクトを作成し、それをコンソールスクリプトエントリポイントとしてエクスポートできます。
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にアプリケーションをインストールすると、カスタムスクリプトを使用できます。 FLASK_APP
を設定する必要はありませんのでご注意ください。
$ pip install -e .
$ wiki run
カスタムスクリプトのエラー
カスタムスクリプトを使用しているときに、モジュールレベルのコードにエラーが発生すると、エントリポイントを読み込めなくなるため、リローダーは失敗します。
flask
コマンドは、コードとは別に、この問題は発生しないため、ほとんどの場合に推奨されます。
PyCharm統合
PyCharm 2018.1より前は、FlaskCLI機能はまだPyCharmに完全に統合されていませんでした。 それらをスムーズに機能させるには、いくつかの調整を行う必要があります。 これらの手順は、使用する可能性のある他のIDEでも同様である必要があります。
PyCharmで、プロジェクトを開いた状態で、メニューバーから実行をクリックし、構成の編集に移動します。 次のような画面が表示されます。
class=screenshot align-center|screenshot of pycharm's run configuration settings 変更するオプションはかなりありますが、1つのコマンドに対して実行すると、構成全体を簡単にコピーして1回調整するだけで、自分で実装できるカスタムコマンドを含む他のコマンドにアクセスできるようになります。
+(新しい構成の追加)ボタンをクリックして、 Python を選択します。 構成に「RunFlaskServer」などのわかりやすい名前を付けます。 flask run
コマンドの場合、サーバーを同時に複数回実行することはできないため、「シングルインスタンスのみ」にチェックを入れてください。
ドロップダウン( A )からモジュール名を選択し、flask
と入力します。
Parameters フィールド( B )は、(任意の引数を使用して)実行するCLIコマンドに設定されます。 この例では、開発サーバーを実行するrun
を使用します。
dotenv の環境変数を使用している場合は、この次の手順をスキップできます。 アプリケーションを識別するために、環境変数( C )を追加する必要があります。 参照ボタンをクリックして、左側にFLASK_APP
、右側にPythonインポートまたはファイル(hello
など)のエントリを追加します。
次に、作業ディレクトリ( D )をアプリケーションが存在するフォルダに設定する必要があります。
プロジェクトをパッケージとしてvirtualenvにインストールした場合は、 PYTHONPATH オプション( E )のチェックを外すことができます。 これにより、後でアプリをデプロイする方法とより正確に一致します。
適用をクリックして構成を保存するか、 OK をクリックしてウィンドウを保存して閉じます。 メインのPyCharmウィンドウで構成を選択し、その横にある再生ボタンをクリックしてサーバーを実行します。
PyCharm内からflask run
を実行する構成ができたので、その構成をコピーし、 Script 引数を変更して、別のCLIコマンドを実行できます。 flask shell
。