为什么 aiohttp 不允许在 url 路径中使用冒号?

Why aiohttp not allows colon in url path?

我正在创建一个通过 webhook 获取更新的电报机器人。 所以,我成功注册了 url 的 webhook,如下所示:

https://my-app.herokuapp.com/123456789:aglbfiwefiuwehwelf  # url with fake token

然后我添加了一个路由来处理更新:

app.router.add_route('POST', '/123456789:aglbfiwefiuwehwelf', webhook)

bot 托管在 heroku 上,当我 运行 它时,我在 heroku 日志中看到 404 错误。我在本地进行了测试,发现 aiohttp 无法用冒号解析 url。我通过使用变量解决了这个问题 app.router.add_route('POST', '/{token}', webhook),但我对为什么实际上 aiohttp 不允许在 url 路径中使用冒号感兴趣?

在 GitHub 中,您可以通过 Blame 历史查看更改代码库特定部分的提交。

  1. 最初只是在 85668a 中检查它不是 None。
  2. 然而这太宽松了,所以设置了一个限制,只接受 a2aa20 中的 Python 个标识符。
  3. 看来还需要放宽规则,因此 98e3a9 通过为点和冒号添加分隔符使规则更加放宽。这是版本 0.18.1。
  4. 添加了下一个破折号 8cc211
  5. 终于也允许使用下划线了3fd3d6

所以从 0.18.1 开始,允许使用冒号。我建议你升级你的 aiohttp 依赖。

另外请注意,我不是 100% 确定您是否可以在 url 模式中使用方括号,请参阅 85668a