Source code for zemfrog.loaders.multiapp

import os
from typing import Dict, List

import click
from flask import Flask
from werkzeug.middleware.dispatcher import DispatcherMiddleware

from ..helper import import_attr
from ..repl import build_repl


[docs]def loader(app: Flask): """ Load all applications and combine them together using ``DispatcherMiddleware``. """ apps: List[Dict] = app.config.get("APPS", []) mounts = {} for a in apps: if not isinstance(a, dict): a = {"name": a} name = a["name"] path = a.get("path", "/" + name) help = a.get("help", "") yourapp: Flask = import_attr(name + ".wsgi.app") @click.command(name, context_settings=dict(ignore_unknown_options=True)) @click.option("-r", "--repl", is_flag=True, help="Activates REPL mode.") @click.argument("args", nargs=-1, type=click.UNPROCESSED) def cli(repl, args): os.environ["FLASK_APP"] = yourapp.import_name if repl: build_repl(yourapp) else: os.system("flask " + " ".join(args)) cli.help = help app.cli.add_command(cli) mounts[path] = yourapp app.wsgi_app = DispatcherMiddleware(app.wsgi_app, mounts)