У меня есть приложение, в котором 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
Мое приложение не в этот момент, потому что нет никакой записи «Джейн Джанет» в базы данных для обновления.
Как я могу избежать этого двойного декодирования знака +
?
Но если это так, почему первая компания * не * расшифровывается, когда моя функция получает ее? –
Какую версию Python и CherryPy вы используете? Кроме того, какой диспетчер вы используете? По умолчанию? 'Routes' или' MethodDispatcher'? Для меня работает '/ Eat/Drink' uri, но, возможно, я не полностью понимаю ваш вопрос. – cyraxjoe
Python 2.7, CherryPy 3.7.0, используя диспетчеризацию маршрутов. Когда я получаю параметры в своем методе,% 2B уже был декодирован для меня, но% 20 и% 2F не имеют. –