refactor: inject api prefix into router startup

This commit is contained in:
jxxghp
2026-08-23 00:54:01 +08:00
parent 4e895c6c67
commit f26bde2250
4 changed files with 18 additions and 9 deletions
+1 -1
View File
@@ -197,7 +197,7 @@ def build_lifecycle_components(app: FastAPI) -> tuple[LifecycleComponent, ...]:
LifecycleComponent( LifecycleComponent(
name="路由", name="路由",
dependencies=("数据库连接预算",), dependencies=("数据库连接预算",),
start=lambda: init_routers(app), start=lambda: init_routers(app, settings.API_V1_STR),
start_order=60, start_order=60,
start_timeout_seconds=30, start_timeout_seconds=30,
), ),
+5 -5
View File
@@ -1,11 +1,11 @@
from fastapi import FastAPI from fastapi import FastAPI
from app.runtime.config import settings def init_routers(app: FastAPI, api_prefix: str = "/api/v1"):
def init_routers(app: FastAPI):
""" """
初始化路由 初始化路由
:param app: 需要挂载路由的 FastAPI 应用
:param api_prefix: v1 API 根路径,由启动组合根传入
""" """
from app.api.router_specs import API_V1_ROUTER_SPECS from app.api.router_specs import API_V1_ROUTER_SPECS
from app.api.servarr import arr_router from app.api.servarr import arr_router
@@ -14,7 +14,7 @@ def init_routers(app: FastAPI):
for spec in API_V1_ROUTER_SPECS: for spec in API_V1_ROUTER_SPECS:
app.include_router( app.include_router(
spec.router, spec.router,
prefix=f"{settings.API_V1_STR}{spec.prefix}", prefix=f"{api_prefix}{spec.prefix}",
tags=list(spec.tags), tags=list(spec.tags),
) )
# Radarr、Sonarr路由 # Radarr、Sonarr路由
@@ -9,7 +9,7 @@
"root": "app" "root": "app"
}, },
"settings_imports": { "settings_imports": {
"count": 125, "count": 124,
"files": [ "files": [
"app/adapters/cache/backends.py", "app/adapters/cache/backends.py",
"app/adapters/cache/redis.py", "app/adapters/cache/redis.py",
@@ -134,8 +134,7 @@
"app/startup/domain_initializer.py", "app/startup/domain_initializer.py",
"app/startup/lifecycle/__init__.py", "app/startup/lifecycle/__init__.py",
"app/startup/modules_initializer.py", "app/startup/modules_initializer.py",
"app/startup/plugins_initializer.py", "app/startup/plugins_initializer.py"
"app/startup/routers_initializer.py"
] ]
}, },
"system_config_oper_constructions": { "system_config_oper_constructions": {
+10
View File
@@ -159,3 +159,13 @@ def test_compatibility_api_router_keeps_public_contract():
) )
} }
assert expected_paths <= paths assert expected_paths <= paths
def test_init_routers_accepts_composition_root_api_prefix():
"""路由初始化应使用组合根传入的 API 前缀。"""
from app.startup.routers_initializer import init_routers
app = FastAPI()
init_routers(app, "/custom/v1")
assert "/custom/v1/system/ping" in app.openapi()["paths"]