我正在与一个曾经向我发送如下 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。
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根据结果构建一个新的函数(并且可能在必要时使用它来更新当前函数)。
unquote()
HttpRequest.body
QueryDict