Я использую пилоны, и некоторые из моих URL-адресов содержат неанглийские символы, например:
http://localhost:5000/article/111/文章标题
В большинстве случаев это не проблема, но в моем модуле регистрации после выхода пользователя из системы я пытаюсь получить referer
из request.headers
и перенаправить на этот URL.
if user_logout:
referer = request.headers.get('referer', '/')
redirect(referer)
К сожалению, если url содержит неанглийские символы и с помощью браузера IE, он сообщит об этой ошибке (Firefox в порядке):
WebError Traceback:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd5 in position 140: ordinal not in range(128)
View as: Interactive (full) | Text (full) | XML (full) clear this
clear this
URL: http://localhost:5000/users/logout
Module weberror.evalexception:431 in respond view
Есть способ исправить это (но не полезно), используйте urllib.quote()
для преобразования URL-адреса перед перенаправлением.
referer = quote_path(url) # only quote the path of the url
redirect(referer)
Это нехорошее решение, потому что оно работает только в том случае, если brower IE, и очень скучно. Есть ли хорошее решение?
Наконец, я до сих пор не нашел хорошего решения и использую этот код:
referer = urllib.quote(referer, '.:/?=;-%#')
Кажется, сейчас хорошо, но я не чувствую себя в безопасности.
Попробуйте проверить RFC для URL-адресов, отличных от ascii. Если я правильно помню, они преобразуются в эквивалент ascii. Затем вы можете перенаправить на это.
Изменить: Согласно @ssokolov (см. комментарии ниже):
Конкретными условиями поиска являются IDN (Интернационализированные имена доменов) и Punycode
Перенаправление работает, создавая исключение. Это поймано и преобразовано в HTTP-ответ Как насчет указания кодировки для вашего ответа?
response.charset = 'utf8'
response.charset='utf8'
, даже request.charset='utf8'