2012-06-26 63 views
4

我說話的那用來發送HTTP我的字符串這樣的服務器:德編碼的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

我懷疑你想要的是urllib模塊的unquote函數。

>>> 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' 

編輯:我不是很熟悉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專家,所以你可能希望等待其中一個人加入。 –