Представете си, че имам голямо CLI приложение с много различни команди (помислете, например image-magick).
Исках да организирам това приложение в модули и т.н. Така че някъде щеше да има главен click.group
:
#main.py file
@click.group()
def my_app():
pass
if __name__ == "__main__":
my_app()
които могат да бъдат импортирани във всеки модул, който дефинира команда:
from main import my_app
# command_x.py
@my_app.command()
def command_x():
pass
Проблемът е, че се натъквам на проблем с кръгово импортиране, тъй като файлът main.py
не знае нищо за command_x.py
и трябва да го импортирам, преди да извикам основната секция.
Това се случва и във Flask и обикновено се обработва с модела на фабриката за приложения. Обикновено приложението ще бъде създадено преди изгледите:
app = Flask("my_app")
@my_app.route("/")
def view_x():
pass
if __name__ == "__main__":
app.run()
В модела на фабриката за приложения вие отлагате „регистрацията“ на чертежите:
# blueprints.py
blueprint = Blueprint(yaddayadda)
@blueprint.route("/")
def view_x():
pass
И направете фабрика, която знае как да изгради приложението и да регистрира чертежите:
#app_factory.py
from blueprints import view_x
def create_app():
app = Flask()
view_x.init_app(app)
return app
След това можете да създадете скрипт за стартиране на приложението:
#main.py
from app_factory import create_app
if __name__ == "__main__":
app = create_app()
app.run()
Може ли подобен модел да се използва с Click? Мога ли просто да създам „приложение за кликване“ (може би разширяващо click.Group
), където регистрирам „контролерите“, които са отделните команди?