Immaginate di avere una grande applicazione CLI con molti comandi diversi (pensate, per esempio, image-magick).È possibile utilizzare il modello "app factory" da Flask con Click CLI applications?
ho voluto organizzare questa applicazione in moduli, ecc Quindi, ci sarebbe stato un maestro click.group
da qualche parte:
#main.py file
@click.group()
def my_app():
pass
if __name__ == "__main__":
my_app()
che può essere importato in ogni modulo che definiscono un comando:
from main import my_app
# command_x.py
@my_app.command()
def command_x():
pass
Il problema è che mi imbatto in un problema di importazione circolare, dal momento che il file non sa nulla di command_x.py
e dovrei importarlo prima di chiamare la sezione principale.
Questo accade anche in Flask e viene solitamente gestito con il modello di fabbrica dell'app. Di solito si avrebbe l'applicazione in fase di creazione, prima i punti di vista:
app = Flask("my_app")
@my_app.route("/")
def view_x():
pass
if __name__ == "__main__":
app.run()
Nel modello App Factory si posticipare la "registrazione" dei progetti:
# blueprints.py
blueprint = Blueprint(yaddayadda)
@blueprint.route("/")
def view_x():
pass
e fare una fabbrica che sa come costruire l'applicazione e registrare i progetti:
#app_factory.py
from blueprints import view_x
def create_app():
app = Flask()
view_x.init_app(app)
return app
e si può quindi creare uno script per eseguire l'applicazione:
#main.py
from app_factory import create_app
if __name__ == "__main__":
app = create_app()
app.run()
È possibile utilizzare un modello simile con Click? Potrei semplicemente creare una "click application" (magari estendendo click.Group
) dove registro i "controller" che sono i singoli comandi?