Как перенаправить на URL с неанглийскими символами? - PullRequest
2 голосов
/ 02 сентября 2010

Я использую пилоны, и некоторые из моих 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)

Это не очень хорошее решение, потому что оно работает, только если браузер IE, и очень скучно.Есть ли хорошее решение?

Ответы [ 3 ]

1 голос
/ 02 сентября 2010

Попробуйте проверить RFC для не-ascii URL.Они преобразованы в эквивалент ASCII, если я правильно помню.Вы можете затем перенаправить на это.

Редактировать: Согласно @ssokolov (см. Комментарии ниже):

Определенные термины для поиска являются IDN ( интернационализированных доменных имен ) и Punycode

1 голос
/ 02 сентября 2010

Наконец, я все еще не могу найти хорошее решение и использую этот код:

referer = urllib.quote(referer, '.:/?=;-%#')

Кажется, сейчас работает хорошо, но я не чувствую себя в безопасности.

0 голосов
/ 02 сентября 2010

Redirect работает, вызывая исключение. Это пойман и преобразован в ответ HTTP Как насчет указания кодировки для вашего ответа?

response.charset = 'utf8'

...