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:
@@ -31,8 +31,6 @@ tenant_source.py(配置 API 的重置出厂同样消费);版本 1 写入改走
|
||||
db.write_config_version(与配置 API 的 PUT/rollback/reset 同一版本写入
|
||||
路径,单一事实源);Tenant 落 profile 列(重置出厂按它取对应档案组)。
|
||||
"""
|
||||
import re
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||
from pydantic import BaseModel, Field
|
||||
from sqlalchemy import func, select
|
||||
@@ -55,14 +53,16 @@ from app.platform.db import (
|
||||
other_push_prefixes,
|
||||
write_config_version,
|
||||
)
|
||||
from app.platform.registry import _normalize_host
|
||||
# slug 形态校验的单一事实源在 registry(TENANT_SLUG_RE——创建校验与
|
||||
# 路径前缀解析 /t/<slug>/ 共用,永不漂移,spec 2026-10-19 §3.1);别名
|
||||
# import 让本文件既有 SLUG_RE 引用零改动
|
||||
from app.platform.registry import TENANT_SLUG_RE as SLUG_RE, _normalize_host
|
||||
from app.platform.tenant_source import _profile_snapshot
|
||||
|
||||
router = APIRouter(prefix="/api/platform/tenants", tags=["platform-tenants"])
|
||||
|
||||
PROFILES = ("auto", "jiancai", "blank")
|
||||
STATUSES = ("active", "disabled")
|
||||
SLUG_RE = re.compile(r"^[a-z0-9-]+$")
|
||||
|
||||
|
||||
# ---- 校验助手 -------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user