2017-03-12 9 views
5

Definiuję moją aplikację Flask przy użyciu wzoru fabryki aplikacji. Używając Flask-Script, mogę przekazać funkcję fabryczną do Manager. Chciałbym zamiast tego użyć wbudowanego interfejsu klienckiego Click CLI. Jak korzystać z fabryki za pomocą Click?Użyj CLIP Kliknij CLI z wzorem fabrycznym aplikacji

Mój aktualny kod używa Flask-Script. Jak mam to zrobić z 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() 

Odpowiedz

6

Komenda flask jest interfejsem Kliknij tworzone flask.cli.FlaskGroup. Stwórz własną grupę i przekaż jej funkcję fabryczną. Użyj app.shell_context_processor, aby dodać obiekty do powłoki.

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() 

Uruchom swój plik zamiast polecenia flask. Dostaniesz interfejs Click za pomocą fabryki.

FLASK_DEBUG=1 python app.py run 

Idealnie utworzyć punkt wejścia i zainstalować pakiet w env. Następnie możesz wywołać skrypt jako polecenie. Utwórz plik setup.py co najmniej z poniższymi.

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 

Używanie własnego CLI jest mniej wytrzymałe niż wbudowane polecenie flask. Ponieważ twój obiekt cli jest zdefiniowany za pomocą innego kodu, błąd na poziomie modułu spowoduje awarię reloadera, ponieważ nie może on już importować obiektu. Polecenie flask jest oddzielne od projektu, więc nie ma na nie wpływu błędy w module.

Powiązane problemy