feat(middleware): /t/<slug>/ 路径前缀解析(与 Host 模式共存)

- TenantHostMiddleware 增路径前缀分支:raw_path 直判 slug 段(未编码
  [a-z0-9-],%61uto/大写/点号不匹配落 Host 解析);仅带尾斜杠形态剥离;
  path 定长切割(保留前缀尾斜杠为剩余路径领头斜杠),raw_path 按解码
  path 重编码重算(非长度截断),orig_path 留痕;未知 404/ws 1008、
  停用 503/ws 1013 与 Host 模式同语义
- _PREFIX_RE 字符类取自 registry.TENANT_SLUG_RE(掐 ^$ 锚)单一事实源;
  tenant_routes 的 SLUG_RE 换源同常量别名 import(删本地定义与 import re)
- 评审折入:registry 空 sites 分支注释纠正为生产可达(DB 源全站点停用
  合法状态),test_registry 用例 docstring 同步;conftest ADMIN_PASSWORD
  注释补硬编码登录用例警示
- 新增 TestPathPrefixRouting 13 用例(全链/拒绝族/停用/site 覆盖/豁免
  优先/direct-ASGI 改写钉位/WS 双例/路径优先)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-19 17:27:01 +08:00
parent 6fc43c1f1c
commit 9b97eafa1c
6 changed files with 248 additions and 10 deletions
+2 -1
View File
@@ -17,7 +17,8 @@ from app.engine.models import Base
# 测试环境封闭(2026-10-19 修复):Settings(BaseSettings) 会读仓库 .env——
# 开发机 .env 的 ADMIN_PASSWORD(如 Docker 测试环境的强密码)会盖过 lifespan
# 引导的出厂值 admin123,测试登录全员 401。真实环境变量优先级本就高于
# .env,这里把测试期望值钉进 os.environ(已显式设置则不覆盖,CI 可另行注入)。
# .env,这里把测试期望值钉进 os.environ(已显式设置则不覆盖,CI 可另行
# 注入;注入非 admin123 值会破坏 ~20 个硬编码登录用例)。
os.environ.setdefault("ADMIN_PASSWORD", "admin123")
# Task 5b 装配切换: app 不再有全局 engine/async_session——旧 conftest 里