27 lines
1.2 KiB
Python
27 lines
1.2 KiB
Python
|
|
"""路由取当前租户运行时——Task 5b→7 的过渡兜底。
|
||
|
|
|
||
|
|
Task 7 的 Host 中间件上线前,没有人为请求挂 ``state.tenant``。本助手的
|
||
|
|
兜底规则 = state 里有租户用 state 的(中间件灰度接入即生效);没有则用
|
||
|
|
``app.state.default_runtime``(lifespan 预热的默认租户 jiancai),API 测试
|
||
|
|
与直连(无 Host 语义)在 5b→7 过渡期不断。
|
||
|
|
|
||
|
|
已知过渡限制(记录在案,Task 7 一并解决):默认租户经 registry_reload
|
||
|
|
热切换后 default_runtime 仍指向旧 runtime——过渡期不修,Task 7 中间件
|
||
|
|
按请求 Host 重新 resolve 后本模块整体删除。
|
||
|
|
"""
|
||
|
|
from fastapi import Request, WebSocket
|
||
|
|
|
||
|
|
from app.platform.registry import TenantRuntime
|
||
|
|
|
||
|
|
|
||
|
|
def get_runtime(request_or_ws: Request | WebSocket) -> TenantRuntime:
|
||
|
|
"""state.tenant 优先,缺省落 app.state.default_runtime(Task 7 删)。"""
|
||
|
|
runtime = getattr(request_or_ws.state, "tenant", None)
|
||
|
|
if runtime is not None:
|
||
|
|
return runtime
|
||
|
|
runtime = getattr(request_or_ws.app.state, "default_runtime", None)
|
||
|
|
if runtime is None or runtime.session_factory is None:
|
||
|
|
raise RuntimeError(
|
||
|
|
"默认租户运行时未就绪——lifespan 未运行或未预热 default_runtime")
|
||
|
|
return runtime
|