2017-03-12 10 views
5

私は、アプリケーションの工場のパターンを使用して私のFlaskアプリケーションを定義します。 Flask-Scriptを使用している場合は、ファクトリ関数をManagerに渡すことができます。 Flaskの組み込みのClick CLIを代わりに使用したいと思います。 Clickを使用して工場を使用するにはどうすればよいですか?アプリケーションの工場パターンでFlaskのClick CLIを使用

現在のコードでは、Flask-Scriptを使用しています。 Clickでこれを行うには?

from flask import Flask 
from flask_script import Manager, Shell 

def create_app(): 
    app = Flask(__name__) 
    ... 
    return app 

manager = Manager(create_app) 

def make_shell_context(): 
    return dict(app=app, db=db, User=User, Role=Role) 

manager.add_command('shell', Shell(make_context=make_shell_context)) 

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

答えて

6

flaskコマンドはflask.cli.FlaskGroupで作成をクリックインタフェースです。独自のグループを作成し、ファクトリ関数に渡します。 app.shell_context_processorを使用して、オブジェクトをシェルに追加します。

from flask import Flask 
from flask.cli import FlaskGroup 
from flask_sqlalchemy import SQLAlchemy 

db = SQLAlchemy() 

def create_app(script_info=None): 
    app = Flask(__name__) 
    db.init_app(app) 
    ... 

    @app.shell_context_processor 
    def shell_context(): 
     return {'app': app, 'db': db} 

    return app 

cli = FlaskGroup(create_app=create_app) 

@cli.command 
def custom_command(): 
    pass 

if __name__ == '__main__': 
    cli() 

flaskコマンドの代わりにファイルを実行します。あなたはあなたの工場を使ってClickインターフェイスを取得します。


FLASK_DEBUG=1 python app.py run 

は理想的には、エントリポイントを作成し、ENVであなたのパッケージをインストールします。次に、スクリプトをコマンドとして呼び出すことができます。 setup.pyファイルを少なくとも作成します。独自のCLIを使用した

project/ 
    app/ 
     __init__.py 
    setup.py 
from setuptools import setup, find_packages 

setup(
    name='my_app', 
    version='1.0.0', 
    packages=find_packages(), 
    entry_points={ 
     'console_scripts': [ 
      'app=app:cli', 
     ], 
    }, 
) 
pip install -e /path/to/project 
FLASK_DEBUG=1 app run 

ビルトインflaskコマンド未満堅牢です。 cliオブジェクトは他のコードで定義されているため、モジュールレベルのエラーが発生すると、オブジェクトをインポートできなくなるため、リローダは失敗します。 flaskコマンドはプロジェクトとは別のコマンドなので、モジュールのエラーの影響を受けません。

関連する問題