Skip to content

Commit da8e7c1

Browse files
authored
Fix the plugin system route injection (#581)
1 parent f513b98 commit da8e7c1

File tree

3 files changed

+27
-23
lines changed

3 files changed

+27
-23
lines changed

backend/core/registrar.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from backend.middleware.jwt_auth_middleware import JwtAuthMiddleware
2424
from backend.middleware.opera_log_middleware import OperaLogMiddleware
2525
from backend.middleware.state_middleware import StateMiddleware
26-
from backend.plugin.tools import plugin_router_inject
26+
from backend.plugin.tools import build_final_router
2727
from backend.utils.demo_site import demo_site
2828
from backend.utils.health_check import ensure_unique_route_names, http_limit_callback
2929
from backend.utils.openapi import simplify_operation_ids
@@ -157,12 +157,8 @@ def register_router(app: FastAPI) -> None:
157157
"""
158158
dependencies = [Depends(demo_site)] if settings.DEMO_MODE else None
159159

160-
# 插件路由
161-
plugin_router_inject()
162-
163-
# 系统路由(必须在插件路由注入后导入)
164-
from backend.app.router import router
165-
160+
# API
161+
router = build_final_router()
166162
app.include_router(router, dependencies=dependencies)
167163

168164
# Extra

backend/plugin/code_generator/api/router.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
from fastapi import APIRouter
44

55
from backend.core.conf import settings
6-
from backend.plugin.code_generator.api.v1.business import router as gen_business_router
7-
from backend.plugin.code_generator.api.v1.column import router as gen_model_router
6+
from backend.plugin.code_generator.api.v1.business import router as business_router
7+
from backend.plugin.code_generator.api.v1.column import router as model_router
88
from backend.plugin.code_generator.api.v1.gen import router as gen_router
99

1010
v1 = APIRouter(prefix=f'{settings.FASTAPI_API_V1_PATH}/gen', tags=['代码生成'])
1111

1212
v1.include_router(gen_router)
13-
v1.include_router(gen_business_router, prefix='/businesses')
14-
v1.include_router(gen_model_router, prefix='/models')
13+
v1.include_router(business_router, prefix='/businesses')
14+
v1.include_router(model_router, prefix='/models')

backend/plugin/tools.py

+20-12
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,13 @@ def inject_extra_router(plugin: str, data: dict[str, Any]) -> None:
134134
raise PluginInjectError(f'扩展级插件 {plugin} 路由注入失败:{str(e)}') from e
135135

136136

137-
def inject_app_router(plugin: str, data: dict[str, Any]) -> None:
137+
def inject_app_router(plugin: str, data: dict[str, Any], target_router: APIRouter) -> None:
138138
"""
139139
应用级插件路由注入
140140
141141
:param plugin: 插件名称
142142
:param data: 插件配置数据
143+
:param target_router: FastAPI 路由器
143144
:return:
144145
"""
145146
module_path = f'backend.plugin.{plugin}.api.router'
@@ -149,10 +150,6 @@ def inject_app_router(plugin: str, data: dict[str, Any]) -> None:
149150
if not routers or not isinstance(routers, list):
150151
raise PluginInjectError(f'应用级插件 {plugin} 配置文件存在错误,请检查')
151152

152-
# 获取目标路由
153-
target_module = import_module_cached('backend.app.router')
154-
target_router = getattr(target_module, 'router')
155-
156153
for router in routers:
157154
plugin_router = getattr(module, router, None)
158155
if not plugin_router or not isinstance(plugin_router, APIRouter):
@@ -166,15 +163,26 @@ def inject_app_router(plugin: str, data: dict[str, Any]) -> None:
166163
raise PluginInjectError(f'应用级插件 {plugin} 路由注入失败:{str(e)}') from e
167164

168165

169-
def plugin_router_inject() -> None:
170-
"""插件路由注入"""
166+
def build_final_router() -> APIRouter:
167+
"""构建最终路由"""
168+
169+
extra_plugins = []
170+
app_plugins = []
171+
171172
for plugin in get_plugins():
172173
data = load_plugin_config(plugin)
173-
# 基于插件 plugin.toml 配置文件,判断插件类型
174-
if data.get('api'):
175-
inject_extra_router(plugin, data)
176-
else:
177-
inject_app_router(plugin, data)
174+
(extra_plugins if data.get('api') else app_plugins).append((plugin, data))
175+
176+
for plugin, data in extra_plugins:
177+
inject_extra_router(plugin, data)
178+
179+
# 主路由,必须在插件路由注入后导入
180+
from backend.app.router import router as main_router
181+
182+
for plugin, data in app_plugins:
183+
inject_app_router(plugin, data, main_router)
184+
185+
return main_router
178186

179187

180188
def _install_plugin_requirements(plugin: str, requirements_file: str) -> None:

0 commit comments

Comments
 (0)