Flask-ScriptからFlask-Cliへの移行


Abstrct
flaskは0.11バージョンからclick提供コマンドラインサポートを導入しており、これまではFlask-Scriptを導入して提供していました.
『Flask web開発』という本の作成時にflask 0.11はまだリリースされていないため、flask-scriptでコマンドラインサポートが提供されています.従ってflask 0では.11リリースから1年後、著者はflask-scriptからFlask-cliへの移行を支援するためにこの文章を書いた.このブログは著者のこの文章の翻訳である.
著者らのClick導入に関する意見
2014年に戻って、Armin Ronacherが私にClickをflaskに統合することを紹介してくれたとき、私は(今も)拒否しました.これはFlaskカーネルプロジェクトに別の依存を追加しました.clickに基づいてflaskとしての拡張を実現し、flask-scriptと公平に競争することをお勧めします.GitHubのissueでこの議論を見ることができますhttps://github.com/smurfix/flask-script/issues/97.
したがって、強制コマンドラインツールはClickに基づいてエラーであり、flaskの基本準則「最も優れたツールを各タスクに使用する」に違反していると確信しています.残念なことに、clickはflaskのコアの一部となってflask-scriptのメンテナンス者を離れ、githubのrepositoryから見ると、このプロジェクトは緩やかに死亡しているようだ.
では、flask-scriptにはどんな問題がありますか?
flaskには確かに重要な欠陥がありますが、同時に十分に面白い欠陥があります.初期に設計されたflask reloaderの問題で、appを直接使用します.run()Flask-Scriptではなくアプリケーションを起動
debugモードでflaskを起動すると、2つのflaskプロセスが実行されます.最初のプロセス(watcherと呼ぶことができます)は、ソースコードの実行を観察し、2番目のプロセスは実際のflaskサーバです.任意のファイルが変更されると、このwatcherはファイルの変更を観察するとkillサービスプロセスを開始し、更新されたソースコードを使用するサーバプロセスを開始します.更新したソースファイルに構文エラーがある場合、問題が発生します.Watcherプロセスは、ソースコードがより良いかどうか分かりません.古いサーバプロセスをkillし、新しいサーバプロセスを実行します.しかし、pythonが変更したファイルを解析するときにエラーが投げ出されるため、新しいサーバプロセスは成功しません.サービスプロセスにエラーがある場合、このwatcherプロセスもバグを修正して再起動するまで終了します.
新しいコマンドflask runコマンドラインを使用するとloadは完璧になります.最初のrequestが送信されるまでアプリケーションはロードされません.ソースファイルを導入してエラーが発生すると、実行時に処理されます.これは、webベースのdebugツールを使用できることを意味します.新しいwatcherプロセスもよりスマートで、サービス側がkillされた後もソースコードの変化を監視し続け、ソースコードが変更された後もサービスを再起動します.
新しいFlask-Li
Flask-CliはFlask-Scriptより優れていますか?新しいFlaskアプリケーションが提供するデフォルトコマンドを振り返ってみましょう
Flask 0をインストールすると11または更新されたバージョンでは、環境変数にflaskコマンドが存在します.
(venv) $ flask
Usage: flask [OPTIONS] COMMAND [ARGS]...

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

  It loads the application configured (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.py
    $ export FLASK_DEBUG=1
    $ flask run

Options:
  --version  Show the flask version
  --help     Show this message and exit.

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

Flask-Scriptを使用するとmanageという名前が作成されます.pyのドライバスクリプト.flask-scriptとflask-cliの対比を見てみましょう
#flask-script -> flask-Cli
./manage.py runserver -> flask run
./manage.py shell ->flask shell

何の違いもないように見えます.
事実上、manage.pyとflaskは、Flaskがインスタンスを適用する方法が全く異なることを発見しました.Flask-Scriptでは、Managerクラスを直接デルのアプリケーションファクトリで使用できます.しかし、新しいFlask-Cliは、アプリケーションインスタンスを提供するのではなくFLASK_を設定します.APPの環境変数は、一般的にファイル名やモジュール名を設定するために使用されます.FLaskは、モジュール内のappまたはアプリケーションのインスタンスを探して使用します.
残念ながら、Flask-Cliは直接ファクトリ関数をサポートしていません.この方法は、ファクトリ関数を使用する必要がある場合は、ファクトリ関数モジュールを定義してappオブジェクトを作成し、FLASK_アプリで引用します.これはwsgi.pyモジュールのDjangoでの概念は一致している
FlaskyアプリケーションにFLask Cliのサポートを提供したい場合は、flaskyで使用できます.pyではこう書きます
import os
from app import create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

我々は新しいCliに完全に移行し、manageを使用していません.py来.
Windows設定FLASK_APP
set FLASK_APP = flasky.py
flask run

flask runコマンドは、reloaderとdebuggerを有効化、無効化する構成を提供します.もちろん、IPのaddressとportを設定してサーバのリスニングを制御することもできます.これらの構成はFlask-Scriptに近いが全く同じではなく、flask run -helpを使用して提供された構成を表示できます.
ほとんどのアプリケーションは、次の方法で起動できます.
if __name__ == '__main__':
    app.run()

CLIサポートを使用する必要がない場合は、このような方法で起動することができます.しかし、新しいcliが必要な場合は、できるだけ削除することができます.
Flask Shellコマンドの使用
shellコマンドは基本的に同じですが、shellコンテキストに自動的にインポートする他のsymbolsをどのように定義するかにはわずかな違いがあります.この機能は、アプリケーションで作業する時間を大幅に節約します.通常、shellのテストまたはデバッグshellにmodelクラス、データベースインスタンス、およびインタラクティブなオブジェクトを追加します.
FLask-Scriptの場合、Flaskyアプリケーションには次のshellコンテキスト定義があります.
def make_shell_context():
    return dict(app=app, db=db, User=User, Follow=Follow, Role=Role,
                Permission=Permission, Post=Post, Comment=Comment)
manager.add_command("shell", Shell(make_context=make_shell_context))

前述のようにmake_shell_context()関数はadd_commandリファレンスはshellパラメータを定義します.Flask-Scriptはshellを起動する前にこの関数を直接呼び出し、symbolを含む辞書を返します.
Flask CLIは同じ機能を提供していますが、確かにdecorator(装飾器)でshellコンテキストオブジェクトかどうかを判断します.FLask-Scriptと同じ機能を持つためにflaskyを拡張しました.pyモジュール.
import os
from app import create_app, db
from app.models import User, Follow, Role, Permission, Post, Comment

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

@app.shell_context_processor
def make_shell_context():
    return dict(app=app, db=db, User=User, Follow=Follow, Role=Role,
                Permission=Permission, Post=Post, Comment=Comment)

ご覧のように、役割は同じですが、Flaskにこれらのshellコンテキストオブジェクトを知らせるには@app.shell_context_processor装飾器が必要です.
Flask拡張コマンドの追加
Flask-Scriptの成功の大きな鍵は、Flaskが独自のコマンドを追加できるようにすることです.Flask-Migrateライブラリは、この利点を最大限に活用しています.
これらのコマンドをflask-cliにどのように移行しますか?これは、拡張の作成者がどのように移行したかによって異なります.もしあなたが使用している拡張子がFLask Cliに適していない場合は、少なくともこれらの拡張子と直接対話している場合は、FLask-Scriptを使用し続けなければなりません.Flask migrateはFLask Cliの更新を提供し、最新バージョンを直接使用すればよい.
Flask Migrateの場合、./manage.py dbは直接flask dbになりました.Flask-ScriptではFlask-Migrateがmanageにいます.pyでは初期化され、FLaskCliではFlask-Scriptバージョンのmanageが必要です.pyの内容はflaskyに移動します.pyでは、わずかな違いしかありません.
import os
from app import create_app, db
from app.models import User, Follow, Role, Permission, Post, Comment
from flask_migrate import Migrate

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
migrate = Migrate(app, db)

@app.shell_context_processor
def make_shell_context():
    return dict(app=app, db=db, User=User, Follow=Follow, Role=Role,
                Permission=Permission, Post=Post, Comment=Comment)

例では、flaskyのデータベースを最新バージョンに更新するには、次のコマンドを使用します.(FLASK_APPの設定忘れずに)
flask db upgrade

コマンドの適用
Flask Scriptのもう一つの優れた特徴は、自分の一般的なタスク(custom work)パッケージ関数をコマンドラインで実行できることです.CLIでもアクセサリーを1つ追加するだけで移行が完了します
元の./manage.py testコマンド
@manager.command
def test(coverage=False):
  """Run the unit tests."""
  # ...

Flask-Cliで
import click

# ...

@app.cli.command()
@click.option('--coverage/--no-coverage', default=False, help='Enable code coverage')
def test(coverage):
    """Run the unit tests."""
    # ...

@app.cli.command()装飾器はClickにインタフェースを提供します.Flask-Scriptではコマンド関数の実行はアプリケーションコンテキストにあるので、Flask-Cliでコンテキストを適用する必要がなければ無効にすることができます.ここで、関数の実際のコードは変更する必要はないが、coverageオプションは@clickを明示的に使用する必要があることに注意する.option装飾器、flask-scriptでは、このオプションは自動的にエクスポートされる関数のパラメータリストです.
Flaskyの他の2つの関数も同様の方法を使用することができ、flaskyモジュールの完全な実現は以下の通りである.
import os
from app import create_app, db
from app.models import User, Follow, Role, Permission, Post, Comment
from flask_migrate import Migrate
import click

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
migrate = Migrate(app, db)

@app.shell_context_processor
def make_shell_context():
    return dict(app=app, db=db, User=User, Follow=Follow, Role=Role,
                Permission=Permission, Post=Post, Comment=Comment)

@app.cli.command()
@click.option('--coverage/--no-coverage', default=False, help='aaa')
def test(coverage=False):
    "Test coverage"
    # ...

@app.cli.command()
@click.option('--length', default=25, help='Profile stack length')
@click.option('--profile-dir', default=None, help='Profile directory')
def profile(length, profile_dir):
    """Start the application under the code profiler."""
    # ...

@app.cli.command()
def deploy():
    """Run deployment tasks."""
    # ...

まとめ
この文書では、Flask-Scriptからの移行に役立つ新しいCLIコマンドラインの機能を説明します.まだ2つのことは本文では言及されていませんが、
flaskコマンドを使用したくない場合は、flask-scriptのようなmanageを作成する方法を説明します.pyのあなた自身のドライバスクリプト?
プロジェクトを通過する方法py"の"Entry points"登録コマンド?
CLI Documentionを調べて彼らを知ることができます
転載先:https://www.cnblogs.com/lynsyklate/p/7693169.html