对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
从结果中构建新的属性(并在必要时使用它来更新当前的属性)。