Skip to content

Commit 5af86e2

Browse files
committed
Pass middleware kwargs through configuration
1 parent 4774b50 commit 5af86e2

File tree

4 files changed

+41
-16
lines changed

4 files changed

+41
-16
lines changed

fps/app.py

+27-8
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ def _load_middlewares(app: FastAPI) -> None:
282282
pkg_names = {get_pkg_name(p, strip_fps=False) for p in grouped_middlewares}
283283
logger.info(f"Loading middlewares from plugin package(s) {pkg_names}")
284284

285+
middleware_dict = {}
285286
for p, middlewares in grouped_middlewares.items():
286287
p_name = Config.plugin_name(p)
287288
plugin_config = Config.from_name(p_name)
@@ -294,7 +295,6 @@ def _load_middlewares(app: FastAPI) -> None:
294295
Config(FPSConfig).enabled_plugins
295296
and p_name not in Config(FPSConfig).enabled_plugins
296297
)
297-
or p_name not in Config(FPSConfig).middlewares
298298
)
299299
if not middlewares or disabled:
300300
disabled_msg = " (disabled)" if disabled else ""
@@ -303,15 +303,34 @@ def _load_middlewares(app: FastAPI) -> None:
303303
)
304304
continue
305305

306-
for plugin_middleware, plugin_kwargs in middlewares:
307-
app.add_middleware(
308-
plugin_middleware,
309-
**plugin_kwargs,
310-
)
306+
logger.info(f"Registered middleware(s) for plugin '{p_name}':")
307+
for middleware in middlewares:
308+
logger.info(f"Middleware: {middleware.__module__}.{middleware.__qualname__}")
311309

312-
logger.info(
313-
f"{len(middlewares)} middleware(s) added from plugin '{p_name}'"
310+
middleware_dict.update(
311+
{
312+
f"{middleware.__module__}.{middleware.__qualname__}": middleware
313+
for middleware in middlewares
314+
}
314315
)
316+
317+
middleware_cnt = 0
318+
for middleware in Config(FPSConfig).middlewares:
319+
middleware_class_path = middleware.class_path
320+
if middleware_class_path not in middleware_dict:
321+
logger.warning(f"Unknown middleware {middleware_class_path}")
322+
continue
323+
324+
logger.info(f"Adding middleware {middleware_class_path}")
325+
middleware_class = middleware_dict[middleware_class_path]
326+
app.add_middleware(
327+
middleware_class,
328+
**middleware.kwargs,
329+
)
330+
middleware_cnt += 1
331+
332+
logger.info(f"{middleware_cnt} middleware(s) added")
333+
315334
else:
316335
logger.info("No plugin middleware to load")
317336

fps/config.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import os
33
from collections import OrderedDict
44
from types import ModuleType
5-
from typing import Dict, List, Tuple, Type
5+
from typing import Any, Dict, List, Tuple, Type
66

77
import toml
88
from pydantic import BaseModel, create_model, validator
@@ -25,6 +25,11 @@ def create_default_plugin_model(plugin_name: str):
2525
return create_model(f"{plugin_name}Model", __base__=PluginModel)
2626

2727

28+
class MiddlewareModel(BaseModel):
29+
class_path: str
30+
kwargs: Dict[str, Any] = {}
31+
32+
2833
class FPSConfig(BaseModel):
2934
# fastapi
3035
title: str = "FPS"
@@ -36,9 +41,9 @@ class FPSConfig(BaseModel):
3641
disabled_plugins: List[str] = []
3742

3843
# plugin middlewares
39-
middlewares: List[str] = []
44+
middlewares: List[MiddlewareModel] = []
4045

41-
@validator("enabled_plugins", "disabled_plugins", "middlewares")
46+
@validator("enabled_plugins", "disabled_plugins")
4247
def plugins_format(cls, plugins):
4348
warnings = [p for p in plugins if p.startswith("[") or p.endswith("]")]
4449
if warnings:

fps/hooks.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ def plugin_name_callback() -> str:
7979

8080

8181
@pluggy.HookspecMarker(HookType.MIDDLEWARE.value)
82-
def middleware() -> Tuple[type, Dict[str, Any]]:
82+
def middleware() -> type:
8383
pass
8484

8585

86-
def register_middleware(m: type, **kwargs: Dict[str, Any]):
87-
def middleware_callback() -> Tuple[type, Dict[str, Any]]:
88-
return m, kwargs
86+
def register_middleware(m: type):
87+
def middleware_callback() -> type:
88+
return m
8989

9090
return pluggy.HookimplMarker(HookType.MIDDLEWARE.value)(
9191
function=middleware_callback, specname="middleware"

plugins/uvicorn/fps_uvicorn/cli.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import os
3+
from pathlib import Path
34
import threading
45
import webbrowser
56
from typing import Any, Dict, List
@@ -86,7 +87,7 @@ def store_extra_options(options: Dict[str, Any]):
8687
f_name = "fps_cli_args.toml"
8788
with open(f_name, "w") as f:
8889
toml.dump(opts, f)
89-
os.environ["FPS_CLI_CONFIG_FILE"] = f_name
90+
os.environ["FPS_CLI_CONFIG_FILE"] = str(Path(f_name).resolve())
9091

9192

9293
@app.command(

0 commit comments

Comments
 (0)