コマンドラインインターフェイス—Flaskドキュメント

提供:Dev Guides
< FlaskFlask/docs/1.0.x/cli
移動先:案内検索

コマンドラインインターフェイス

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
helloapp2 Flaskインスタンスを使用します。
FLASK_APP="hello:create_app('dev')"
hellocreate_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_ENVdevelopmentの場合、デバッグモードが有効になります。 デバッグモードを個別に制御する場合は、 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