2017-02-01 4 views
1

У меня есть приложение, в котором URL-адреса должны быть сконструированы с использованием знака «плюс» в URL-адресе (поскольку это имена фактических компаний). У меня возникли проблемы с написанием ссылок на мой HTML-код, которые могут быть правильно получены и обработаны CherryPy. Я считаю, что проблема в том, что только в случае с +, и CherryPy, и мой код пытаются декодировать% 2B во входящем HTML, чтобы он был сначала преобразован (правильно) в +, а затем далее преобразован (неправильно) в пространство.Проблема с URL-адресом, содержащим «+» в CherryPy

Например, рассмотрите URL-адреса формы /: category /: company, где категория Food and Beverage и два возможных названия компании: Eat/Drink/Be Merry и Jane+Janet.

я сделать это в моем HTML с

'/{}/{}'.format(
     urllib.quote_plus(self.category.encode('utf8')), 
     urllib.quote_plus(self.company_name.encode('utf8')) 
) 

Тогда в CherryPy, я получаю категорию и Company_Name с использованием маршрутов, как /:category/:company_name и выполнить следующую обработку company_name:

def Company(category, company_name): 
    print company_name 
    company_name = company_name.encode('utf-8') 
    print company_name 
    company_name = urllib.unquote_plus(company_name) 
    print company_name 
    company_name = company_name.decode('utf-8') 
    print company_name 

это работает правильно для имен компаний без символов, подверженных кодировке URL, и он работает для имен компаний с большинством символов, требующих кодировки URL (например, без проблем с Eat/Drink/Be Merry). Но, если у моего оригинального названия компании был знак +, он не работает. Похоже, что CherryPy уже выполнил часть декодирования для меня (заменив %2B на +), так что, когда я применяю свое собственное декодирование, + заменяется пробелом.

Вот результаты четырех print заявлений для Eat/Drink/Be Merry:

Eat%20%2F%20Drink%20%2F%20Be%20Merry 
Eat%20%2F%20Drink%20%2F%20Be%20Merry 
Eat/Drink/Be Merry 
Eat/Drink/Be Merry 

и Jane+Janet:

Jane+Janet 
Jane+Janet 
Jane Janet 
Jane Janet 

Мое приложение не в этот момент, потому что нет никакой записи «Джейн Джанет» в базы данных для обновления.

Как я могу избежать этого двойного декодирования знака +?

ответ

0

Расшифровка URL-адреса (процентное кодирование) является неотъемлемой частью http-сервера, вам не обязательно иметь вас на руках urllib.unquote_plus.

Если вы действительно хотите получить сырец URI, CherryPy имеет нестандартную REQUEST_URI ключ в среде WSGI, вы можете получить, что с: cherrypy.request.wsgi_environ['REQUEST_URI'].

Но на самом деле вам нужно просто использовать параметры, которые черрипинг посылает вам напрямую, кодирование/декодирование является частью передачи данных с помощью HTTP, это не должно касаться вашей прикладной логики.

+1

Но если это так, почему первая компания * не * расшифровывается, когда моя функция получает ее? –

+0

Какую версию Python и CherryPy вы используете? Кроме того, какой диспетчер вы используете? По умолчанию? 'Routes' или' MethodDispatcher'? Для меня работает '/ Eat/Drink' uri, но, возможно, я не полностью понимаю ваш вопрос. – cyraxjoe

+0

Python 2.7, CherryPy 3.7.0, используя диспетчеризацию маршрутов. Когда я получаю параметры в своем методе,% 2B уже был декодирован для меня, но% 20 и% 2F не имеют. –

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