2010-09-02 3 views
1

Я использую пилоны, и некоторые из моих URL-адресов содержит не английские символы, такие как:Как перенаправить URL-адрес с неанглийскими символами?

http://localhost:5000/article/111/文章标题 

В большинстве случаев, это не будет проблемой, но в моем модуле авторизации, после того, как пользователь вышел из системы, я пытаюсь получить referer от request.headers и перенаправить на этот URL.

if user_logout: 
    referer = request.headers.get('referer', '/') 
    redirect(referer) 

Unforunately, если URL содержит не-латинские символы, и с Брауэр ИЭ, он сообщит такую ​​ошибку (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 и очень скучно. Есть ли хорошее решение?

ответ

0

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

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

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

+0

Это правильный способ сделать это, вы должны кодировать каждый символ не ASCII в URL. Это в спецификации HTTP. – giolekva

0

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

Response.Charset = 'utf8'

+0

Плохая новость: я установил 'response.charset = 'utf8'', даже' request.charset =' utf8'' – Freewind

+0

Это означает, что сам URL-адрес неправильно кодируется. Исправление, которое вы предоставили, может быть расширено. referer = quote_plus (url.encode ('utf8')) Это должно означать несимволы, а затем цитирование URL должно работать. – pyfunc

1

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

Edit: Согласно @ssokolov (см комментарии ниже):

Конкретные условия для поиска являются IDN (Internationalized Domain Names) и Punycode

+0

Это делает следующее преобразование: referer = quote_path (url) – pyfunc

+1

Конкретными условиями поиска являются IDN (интернационализированные доменные имена) и Punycode. – ssokolow

 Смежные вопросы

  • Нет связанных вопросов^_^