Skip to content

Commit a305ab4

Browse files
committed
Add register_middleware hook
1 parent e22345a commit a305ab4

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

fps/app.py

+46
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,51 @@ def _load_routers(app: FastAPI) -> None:
271271
logger.info("No plugin API router to load")
272272

273273

274+
def _load_middlewares(app: FastAPI) -> None:
275+
276+
pm = _get_pluggin_manager(HookType.MIDDLEWARE)
277+
278+
middleware_impls = pm.hook.middleware.get_hookimpls()
279+
if middleware_impls:
280+
grouped_middlewares = _grouped_hookimpls_results(pm.hook.middleware)
281+
pkg_names = {get_pkg_name(p, strip_fps=False) for p in grouped_middlewares}
282+
logger.info(f"Loading middlewares from plugin package(s) {pkg_names}")
283+
284+
registered_middlewares = {}
285+
286+
for p, middlewares in grouped_middlewares.items():
287+
p_name = Config.plugin_name(p)
288+
plugin_config = Config.from_name(p_name)
289+
290+
disabled = (
291+
plugin_config
292+
and not plugin_config.enabled
293+
or p_name in Config(FPSConfig).disabled_plugins
294+
or (
295+
Config(FPSConfig).enabled_plugins
296+
and p_name not in Config(FPSConfig).enabled_plugins
297+
)
298+
)
299+
if not middlewares or disabled:
300+
disabled_msg = " (disabled)" if disabled else ""
301+
logger.info(
302+
f"No middleware registered for plugin '{p_name}'{disabled_msg}"
303+
)
304+
continue
305+
306+
for plugin_middleware, plugin_kwargs in middlewares:
307+
app.add_middleware(
308+
plugin_middleware,
309+
**plugin_kwargs,
310+
)
311+
312+
logger.info(
313+
f"{len(middlewares)} middleware(s) added from plugin '{p_name}'"
314+
)
315+
else:
316+
logger.info("No plugin middleware to load")
317+
318+
274319
def create_app():
275320

276321
logging.getLogger("fps")
@@ -283,6 +328,7 @@ def create_app():
283328

284329
_load_routers(app)
285330
_load_exceptions_handlers(app)
331+
_load_middlewares(app)
286332

287333
Config.check_not_used_sections()
288334

fps/hooks.py

+15
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class HookType(Enum):
1212
ROUTER = "fps_router"
1313
CONFIG = "fps_config"
1414
EXCEPTION = "fps_exception"
15+
MIDDLEWARE = "fps_middleware"
1516

1617

1718
@pluggy.HookspecMarker(HookType.ROUTER.value)
@@ -75,3 +76,17 @@ def plugin_name_callback() -> str:
7576
return pluggy.HookimplMarker(HookType.CONFIG.value)(
7677
function=plugin_name_callback, specname="plugin_name"
7778
)
79+
80+
81+
@pluggy.HookspecMarker(HookType.MIDDLEWARE.value)
82+
def middleware() -> Tuple[type, Dict[str, Any]]:
83+
pass
84+
85+
86+
def register_middleware(m: type, **kwargs: Dict[str, Any]):
87+
def middleware_callback() -> Tuple[type, Dict[str, Any]]:
88+
return m, kwargs
89+
90+
return pluggy.HookimplMarker(HookType.MIDDLEWARE.value)(
91+
function=middleware_callback, specname="middleware"
92+
)

0 commit comments

Comments
 (0)