对URL参数进行解码

Gor*_*oro 4 python django url web-services

我正在和一个曾经向我发送HTTP字符串的服务器说话:

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

所以"info"GET参数包含"="和"&"字符.这是相当不正统的,但我们为它写了一个解析器.但是,最近他们决定对其中的一部分进行编码,所以现在字符串看起来像这样.

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

这打破了我们的解析器,它需要一个像第一个一样的字符串.

我可以以某种方式"解码"字符串,以便我可以使用旧代码(以便在我们重新编写解析器时它不会被破坏)吗?

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

Gre*_* E. 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'
Run Code Online (Sandbox Code Playgroud)

编辑:我对Django不是很熟悉,但是他们的文档请求和响应对象部分说明如下:

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

基于我对这些文档的有限阅读,您可以将该unquote()函数应用于该HttpRequest.body属性并QueryDict在结果中构建一个新的(并且可能在必要时使用它来更新当前的结果).