2016-03-08 92 views
1

我正在将旧系统重新实现为烧瓶应用程序,并且必须保持网址模式不变。其中一个网址直接包含用户的完整电子邮件地址(换句话说,电子邮件地址是url的一部分,而不是GET参数)。烧瓶重定向请求到包含'@'的网址

当我向这个URL发送请求时,除了电子邮件地址中的'@'符号替换为'%40'之外,Flask会自动响应重定向到相同的URL。例如,对/users/new/[email protected]/的请求被重定向到/users/new/user%40example.com/。当我直接向第二个URL发送POST请求时,我甚至会收到来自Flask的响应,所以我假设在处理请求时'%40'会自动转换为'@'字符。

如何让Flask接受包含'@'符号而不重定向的请求?这可能是Werkzeug的错,因为Flask的URL解析系统建立在Werkzeug上。

编辑:我错误地在此问题中列出的初始请求URL中包含一个结尾的斜杠。我的问题实际上是由于没有斜线造成的,而不是用'%40'代替'@'。

+0

你可以更新你的POST网址,以便它使用'%40'而不是文字'@',并避免往返?或者你在乎的是地址栏中的一个不错的网址? 文字'@'[合法](http://stackoverflow.com/a/19737890/223424),但在URL的域/路径部分仍然有点奇怪;可能Flask在更换它时反应过度。 – 9000

+0

如上所述,我尝试将'@'替换为'%',但Flask仍然将请求看作是使用'@'符号发布的。我同意将一个电子邮件地址作为URL路径的一部分是很奇怪的,但我没有权利改变这种情况(许多客户端已经在使用该端点,因此使这种更改可能会破坏向后兼容性)。 – Adam

回答

0

事实证明9000是正确的:'@'符号在URL中是完全合法的字符。因此,这不应该是Flask所抱怨的。比重定向URL中'@'转换为'%40'更不明显的是最初请求中没有结尾的斜线。在写我的问题的时候,我非常关注从'@'到'%40'的变化(事实证明,在URL中同样的事情),我没有注意到末尾丢失的尾部斜线的第一个URL,并在写这个问题时误将它包含在内。

将追踪斜线添加到POST URL,无论该URL是否包含“@”或“%40”,都修复了问题。如果Flask在重定向时将'@'替换为'%40',那没什么可担心的。真正的问题可能完全是由其他问题引起的。