URL 密码 (netloc) 中是否允许使用问号 (?)?

Are question marks (?) allowed in URL passwords (netloc)?

我 运行 我的代码中有一个错误,归结为 python 的 urllib.parse.urlparse 中的意外行为。当 URL 中的密码包含 ? 时,就会发生这种情况。我很不好意思称这是一个错误,因为我不能 100% 确定 URL 在语法上是正确的。例如:

https://user:pass?word@domain.name/path

我希望它解析为:

ParseResult(scheme='https', netloc='user:pass?word@domain.name', path='/path', params='', query='', fragment='')

但它实际上解析为:

ParseResult(scheme='https', netloc='user:pass', path='', params='', query='word@domain.name/path', fragment='')

这些URL正在别处自动格式化,需要支持在密码中使用?。有趣的是,URLS 实际上是 sqlalchemy 连接字符串,sqlalchemy / psycopg2 都按预期解释它们。


问题

URL 密码 (netloc) 中是否允许使用问号 ?? - 理想情况下,答案应参考适当的 RFC 措辞。

或者 python 的行为是否正确?

RFC 2396 中的第 3.2 节指定 ? 在权限组件中保留(这意味着您不允许在该组件中使用它而无需编码,请参阅 2.2)。授权组件 IIUC 是包含 HTTP 方案 URI(参见 3.2.2)的 user-name/password 的组件。