Flask 将请求重定向到包含“@”的网址

Flask redirecting requests to urls containing '@'

我正在将遗留系统重新实现为 Flask 应用程序,并且必须保持 url 模式不变。其中一个 url 直接包含用户的完整电子邮件地址(换句话说,电子邮件地址是 url 的一部分,而不是作为 GET 参数)。

当我向这个 url 发送请求时,Flask 自动响应重定向到同一个 url,只是电子邮件地址中的“@”符号被替换为“%40”。例如,对 /users/new/user@example.com/ 的请求被重定向到 /users/new/user%40example.com/。当我直接向第二个 url 发送 POST 请求时,我什至从 Flask 收到了这个响应,所以我假设 '%40' 在处理时自动转换为 '@' 字符请求。

如何让 Flask 在不重定向的情况下接受对 url 的包含“@”符号的请求?这可能是 Werkzeug 的错,因为 Flask 的 URL 解析系统是基于 Werkzeug 构建的。

编辑:我在这个问题中列出的初始请求 URL 中错误地包含了一个尾部斜线。我的问题实际上是由于缺少斜线引起的,而不是将“@”替换为“%40”。

事实证明 9000 是正确的:'@' 符号在 URL 中是一个完全合法的字符。因此,这不应该是 Flask 所抱怨的。与重定向 URL 中“@”到“%40”的转换相比,更不明显的是初始请求中缺少尾部斜线。在写我的问题时,我太专注于从 '@' 到 '%40' 的变化(事实证明,在 URL 术语中是一样的),我没有注意到丢失的尾随第一个 URL 末尾的斜杠,在写这个问题时错误地包含了它。

在 POST URL 中添加尾部斜杠,无论 URL 是否包含“@”或“%40”,都解决了该问题。如果 Flask 在重定向时将“@”替换为“%40”,则无需担心。真正的问题可能完全是由其他原因引起的。