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
相关产品推荐
相关产品推荐

