2012-06-26 5 views
4

Я говорю на сервер, который используется для отправки мне HTTP строк, как это:De закодировать URL параметры

/path/to/my/handler/?action-query&id=112&type=vca&info=ch=0&type=event&ev16[sts=begin (...) 

Так что «информация» параметр GET включено «=» и «&» символов. Это было довольно неортодоксально, но тем не менее мы написали для него парсер. Тем не менее, в последнее время они решили закодировать часть, так что теперь строка выглядит следующим образом ..

/path/to/my/handler/?action=query&id=112&type=vca&info=ch%3D0%26type%3Devent%26ev46[sts%3Dbegin (...) 

Это нарушает наш синтаксический анализатор, который ожидает строку, как и первый.

Могу ли я как-то «де-кодировать» строку, чтобы я мог использовать старый код (чтобы он не был сломан, когда мы перезаписываем парсер)?

В соответствии с нижеприведенным ответом мы можем использовать urllib.unquote() для очистки строки вверх. Однако мы полагаемся на request.GET, который настраивается на основе первой строки. Возможно ли восстановить объект GET на основе новой преобразованной строки или каким-то образом заставить ее переоценить?

ответ

5

Я подозреваю, что вам нужна функция unquote от модуля urllib.

>>> s = '/path/to/my/handler/?action=query&id=112&type=vca&info=ch%3D0%26type%3Devent%26ev46[sts%3Dbegin' 
>>> import urllib 
>>> urllib.unquote(s) 
'/path/to/my/handler/?action=query&id=112&type=vca&info=ch=0&type=event&ev46[sts=begin' 

Edit: Я не очень хорошо знаком с Django, но Request and response object section of their docs состояния следующее:

QueryDict случаи являются неизменными, если не создать копию() из них. Это означает, что вы не можете напрямую изменять атрибуты request.POST и request.GET.

Основываясь на моем ограниченном чтении этой документации, вы можете быть в состоянии применить функцию unquote() к атрибуту HttpRequest.body и построить новый QueryDict из результатов (и, возможно, использовать его, чтобы обновить ваш текущие один, если это необходимо) ,

+0

Да, это избавляет от закодированных символов. Любое предложение о том, как я могу сделать request.GET вести себя так, как если бы он получил строку без кавычек? – Goro

+0

@Goro, см. Редактирование моего первоначального ответа. Я не гуру Django, поэтому вы можете подождать, пока один из них перезвонит. –

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