对URL参数进行解码


问题内容

我正在与用于向我发送HTTP字符串的服务器交谈,如下所示:

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

因此,“ info” GET参数包含“
=”和“&”字符。这是非常不合常规的,但是我们还是为此编写了一个解析器。但是,最近他们决定对它的一部分进行编码,因此现在字符串看起来像这样。

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

这会破坏我们的解析器,该解析器期望一个类似于第一个的字符串。

我可以以某种方式“解密”字符串,以便使用旧代码(以便在重新编写解析器时不会损坏)吗?

按照下面的答案,我们可以使用urllib.unquote()清理字符串。但是,我们依赖request.GET,它是根据第一个字符串设置的。是否可以基于新的转换后的字符串来重构GET对象,或者以某种方式强制其重新评估?


问题答案:

我怀疑您想要的是模块中的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'

编辑:我对Django不太熟悉,但是他们的文档的“请求和响应对象”部分指出以下内容:

QueryDict实例是不可变的,除非您创建它们的copy()。这意味着您不能直接更改request.POST和request.GET的属性。

根据我对这些文档的有限阅读,您也许可以将unquote()函数应用于HttpRequest.body属性并QueryDict从结果中构建新的属性(并在必要时使用它来更新当前的属性)。