最标准方式是用app.Party创建路由组,它生成继承父配置但路径独立的子路由器,支持嵌套、显式中间件挂载及别名URL生成,避免手动拼接前缀和全局搜索替换。

用 app.Party 创建带前缀的路由组
在 Iris 中,给一批路由加统一前缀,最标准、最可控的方式是用 app.Party。它不是简单拼字符串,而是生成一个继承父应用配置(如中间件、模板设置)但拥有独立路径根的子路由器。
常见错误现象:直接在每个 app.Get 路径里手动写 /api/v1/users,后期改前缀要全局搜索替换,且无法按组挂载中间件。
-
app.Party("/api")返回的是一个新的*iris.Router实例,后续所有.Get、.Post都自动挂载到该前缀下 - 子路由不自动继承父级中间件——哪怕你调了
app.Use(auth.Middleware),Party里仍需显式admin.Use(auth.Middleware) - 支持嵌套:
v1 := app.Party("/v1"); users := v1.Party("/users"),最终注册users.Get("/{id:uint64}", handler)对应路径是/v1/users/{id:uint64}
Party 和全局 app.Get 混用会出什么问题
很多人想“先配个 /admin 前缀,再零散补几个 /health 或 /metrics”,结果发现部分路由 404 或中间件没生效——这是因为 app.Get 注册到默认路由器,而 Party 创建的是独立路由树,二者不互通。
使用场景:你有一组管理接口(/admin/xxx)需要鉴权,但 /health 必须裸奔可访问。这时不能把 /health 写进 admin.Party(),也不能指望它自动“逃出”前缀约束。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 正确做法:单独用
app.Get("/health", healthHandler),它和admin := app.Party("/admin")并行存在,互不影响 - 错误写法:
admin.Get("/health", ...)→ 实际路径变成/admin/health,不符合预期 - 若真需要跨前缀共享逻辑,提取 handler 函数复用,而不是强行塞进同一个
Party
带中间件的前缀分组怎么写才不漏掉认证
用 Party 加前缀时,最容易忽略的是中间件必须手动挂载。Iris 不会把 app.Use() 的中间件自动透传给子路由,这是设计使然,不是 bug。
性能影响:漏掉 .Use() 不仅导致鉴权失效,还可能让日志、压缩、CORS 等通用中间件缺失,造成响应头异常或传输体积变大。
- 公共中间件(如
iris.Compression、middleware.CORS())应在app.Use()全局注册,它们对所有路由(含Party)都生效 - 专属中间件(如
v2Auth.OAuth2())必须在对应Party实例上调用.Use(),例如:v2 := app.Party("/v2").Use(v2Auth.OAuth2()) - 如果中间件依赖依赖注入(如 hero 注册的服务),确保
hero.Register()在app.Party之前完成,否则 handler 里参数解析失败
路由别名 + 前缀组合生成 URL 时要注意什么
当你给 Party 下的路由起了别名(比如 admin.Get("/users", handler, "admin.users")),用 c.Router().URI("admin.users") 生成 URL 时,Iris 会自动拼上前缀,返回 /admin/users —— 这是它设计的便利点。
容易踩的坑:别名重复、参数键名不一致、或在 BeforeActivation 钩子里注册了路由但忘了设别名,导致 URI() 返回空或原始占位符。
- 别名必须全局唯一,重复会 panic 报错:
duplicate route name "admin.users" - 参数键名严格匹配路由定义中的变量名,
/users/{id:uint64}就得传iris.Map{"id": 123},传"ID"或"userid"会失效 - 在模板中用
{{ urlpath "admin.users" }}前,确认已通过app.RegisterView(...Funcs(...))注入了urlpath函数
Party 是独立路由树这个事实——它不像 Nginx 的 location 那样只是路径重写,而是有自己生命周期和中间件链的子系统。


















