Flask 0.11で追加されたコマンドラインインタフェースを追ってみる

本日ついに、Flaskのnew versionがリリースされました。めでたいですね! 前回のリリースが2013/06/14だったので、ほぼ3年ぶりです。

バージョンを1.0に上げるという話がありマイルストーンも立っていましたが、0.11としてリリースされました。 1.0にしなかったのは、Flaskのコマンドラインインタフェースが特に大きな理由となっているようです。 この記事では、そのコマンドラインインタフェースを追ってみます。

Flask 0.11 Released | The Pallets Projects

Flask-Script

これまでdjangoのmanage.pyみたいなものが欲しい場合、Flask-Scriptというライブラリがよく使われていたと思います。

# http://flask-script.readthedocs.io/en/latest/
# manage.py

from flask.ext.script import Manager

from myapp import app

manager = Manager(app)

@manager.command
def hello():
    print "hello"

if __name__ == "__main__":
    manager.run()

こんな感じのmanage.pyを作成すると、 manage.py runserver とか manage.py shell が使えます。 またFlask-MigrateというFlask-Scriptを利用したライブラリを使うことで、DBのマイグレーション等もDjangoライクに行うことができ、とても便利でした。 ちなみにFlask-Migrateの開発者のmiguelgrinbergさんは、Flask Web Developmentという書籍でも紹介しています(これとても良書でした)。

Flask Web Development: Developing Web Applications with Python

追記

Flask-Migrateは今回のFlaskのClickベースのCLIをサポートするのか聞いてみたところ、後方互換を保つように導入するのがやはり難しそうな感じ。FlaskのClickベースCLIのサポートはまだ時間がかかるかなぁという雰囲気

github.com

Flaskの新しいコマンドラインインターフェース

Added :command:flask and the flask.cli module to start the local debug server through the click CLI system. This is recommended over the old flask.run() method as it works faster and more reliable due to a different design and also replaces Flask-Script.

Flask開発者のmitsuhikoさんはclickというコマンドラインインタフェースを作成するための便利なライブラリを開発していました。 Flask-ScriptやFlask-Migrateは便利で広く使われていましたが、Flask-ScriptがClickを使わずに実装されています。 今回の変更はClickベースのCLIに統一したかったようです。早速0.11を入れてHelpを表示してみました

$ flask --help
Usage: flask [OPTIONS] COMMAND [ARGS]...

  This shell command acts as general utility script for Flask applications.

  It loads the application configured (either through the FLASK_APP
  environment variable) and then provides commands either provided by the
  application or Flask itself.

  The most useful commands are the "run" and "shell" command.

  Example usage:

    $ export FLASK_APP=hello
    $ export FLASK_DEBUG=1
    $ flask run

Options:
  --help  Show this message and exit.

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

Run ServerとRun Shell

まずアプリケーションがFlaskのアプリケーションを見つけられるように環境変数 FLASK_APPPythonのモジュールパスもしくはファイルパスを指定する必要があります。 サーバやシェルの起動は、最初からコマンドが用意されていて、↓のように行うことができます。

$ export FLASK_APP=hello
$ flask run    # Run Server
$ flask shell  # Run Shell

またデバッグモードで起動したい際も FLASK_DEBUG 環境変数で指定できます。いいですね。

CLIのカスタマイズ

ClickベースのCLIに統一されたため、自作のコマンドを追加することがClickに慣れている人は簡単に行えるようになりました。

import os
import click
from flask.cli import FlaskGroup

def create_wiki_app(info):
    from yourwiki import create_app
    return create_app(
        config=os.environ.get('WIKI_CONFIG', 'wikiconfig.py'))

@click.group(cls=FlaskGroup, create_app=create_wiki_app)
def cli():
    """This is a management script for the wiki application."""

if __name__ == '__main__':
    cli()

CLIプラグインの作成

プラグインを作りたい場合も↓のように、clickをベースのコードで記述出来ます。

import click

@click.command()
def cli():
    """This is an example command."""

おわりに

とりあえず0.11のリリースおめでとうございます。 ClickベースのCLIに統一されるのは個人的にとてもうれしいですね。

他にもApplicationのFactory関数の扱いをどうすればいいかなど、ドキュメントの方に詳しく書かれているので、Flaskのプロジェクトを0.11アップグレードする際はこれを読みながらやると良いと思います。

http://flask.pocoo.org/docs/0.11/cli/

Flask Web Development: Developing Web Applications with Python

Flask Web Development: Developing Web Applications with Python