Python 如何重定向到包含非英语字符的url?
我正在使用挂架,我的一些URL包含非英语字符,例如:Python 如何重定向到包含非英语字符的url?,python,url,pylons,non-english,webob,Python,Url,Pylons,Non English,Webob,我正在使用挂架,我的一些URL包含非英语字符,例如: http://localhost:5000/article/111/文章标题 在大多数情况下,这不会是一个问题,但在我的登录模块中,在用户注销后,我尝试从请求.headers中获取引用者,并重定向到该url if user_logout: referer = request.headers.get('referer', '/') redirect(referer) 不幸的是,如果url包含非英语字符,并且浏览器为IE,则会
http://localhost:5000/article/111/文章标题
在大多数情况下,这不会是一个问题,但在我的登录模块中,在用户注销后,我尝试从请求.headers
中获取引用者
,并重定向到该url
if user_logout:
referer = request.headers.get('referer', '/')
redirect(referer)
不幸的是,如果url包含非英语字符,并且浏览器为IE,则会报告此类错误(Firefox可以):
有一种方法可以修复它(但效果不佳),在重定向之前使用urllib.quote()
转换url
referer = quote_path(url) # only quote the path of the url
redirect(referer)
这不是一个好的解决方案,因为它只适用于浏览器是IE的情况,而且非常无聊。有什么好办法吗 重定向通过引发异常来工作。这将被捕获并转换为HTTP响应 为您的响应指定字符集如何
response.charset='utf8'尝试检查RFC中的非ascii URL。如果我没记错的话,它们被转换成ascii等价物。然后你可以重定向到那个 根据@ssokolov编辑:(见以下评论):
要查找的具体术语是IDN ()及
最后,我仍然没有找到一个好的解决方案,并使用以下代码:
referer = urllib.quote(referer, '.:/?=;-%#')
现在它似乎工作正常,但我觉得不安全。坏消息是:我设置了
响应。charset='utf8'
,甚至请求。charset='utf8'
这意味着url本身没有正确编码。您提供的修复程序可以扩展。referer=quote_plus(url.encode('utf8'))这应该对非字符进行编码,然后对url进行引用。这可以进行转换:referer=quote_路径(url)要查找的特定术语是IDN(国际化域名)和Punycode。这是正确的方法,您应该对url中的每个非ASCII字符进行编码。它在HTTP规范中。
referer = urllib.quote(referer, '.:/?=;-%#')