You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

aiohttp多级子应用添加问题:/wt/sub/page2/路径无法访问排查

搞定aiohttp子子应用的路径匹配问题

嘿,我来帮你理清这个路径找不到的问题~你的核心思路其实没毛病,子子应用的路径确实是父应用前缀+子应用前缀+自身路由的拼接,但你踩了aiohttp路径处理的一个小细节坑!

问题出在哪?

你给子子应用加前缀时用了/sub/(结尾带斜杠),而subsubapp的路由是/page2/(开头带斜杠),两者直接拼接后会变成/sub//page2/,再加上父应用的/wt/,最终实际能匹配的路径是/wt/sub//page2/——而你访问的是/wt/sub/page2/,自然找不到啦!

aiohttp子应用路径拼接的核心规则

aiohttp在处理子应用前缀时,只会做简单的字符串拼接,不会自动合并重复的斜杠。要得到预期的路径,得保证前缀和路由的斜杠衔接合理,两种常见的正确写法:

  • 写法一:前缀结尾不带斜杠,子应用路由开头带斜杠
    比如把subapp.add_subapp('/sub/', subsubapp)改成subapp.add_subapp('/sub', subsubapp),这样/sub + /page2/就会得到/sub/page2/,组合父应用的/wt/就是你要的/wt/sub/page2/。
  • 写法二:前缀结尾带斜杠,子应用路由开头不带斜杠
    把subsubapp的路由改成subsubapp.router.add_get('page2/', handler),这样/sub/ + page2/也会得到/sub/page2/,最终路径同样符合预期。

修正后的代码示例(写法一)

from aiohttp import web

async def handler(request):
    return web.Response(text="Hello from subsubapp!")

app = web.Application()
subapp = web.Application()
subapp.router.add_get('/page1/', handler)
app.add_subapp('/wt/', subapp)

subsubapp = web.Application()
subsubapp.router.add_get('/page2/', handler)
# 调整前缀,去掉结尾的斜杠
subapp.add_subapp('/sub', subsubapp)

if __name__ == '__main__':
    web.run_app(app)

修正后的代码示例(写法二)

from aiohttp import web

async def handler(request):
    return web.Response(text="Hello from subsubapp!")

app = web.Application()
subapp = web.Application()
subapp.router.add_get('/page1/', handler)
app.add_subapp('/wt/', subapp)

subsubapp = web.Application()
# 调整路由,去掉开头的斜杠
subsubapp.router.add_get('page2/', handler)
subapp.add_subapp('/sub/', subsubapp)

if __name__ == '__main__':
    web.run_app(app)

现在再访问/wt/sub/page2/就能正常匹配到啦!

内容的提问来源于stack exchange,提问作者vvkatwss vvkatwss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:20:58