【问题标题】:De-encode URL parameters对 URL 参数进行解码
【发布时间】:2012-06-26 20:17:40
【问题描述】:

我正在与一个曾经向我发送如下 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 对象,或者以某种方式强制它重新评估?

【问题讨论】:

    标签: python django web-services url


    【解决方案1】:

    我怀疑你想要的是 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 实例是不可变的,除非您创建它们的 copy()。这意味着您不能直接更改 request.POST 和 request.GET 的属性。

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

    【讨论】:

    • 是的,这确实消除了编码字符。关于如何使 request.GET 表现得好像它收到未引用的字符串的任何建议?
    • @Goro,请参阅对我原始答案的编辑。我不是 Django 大师,所以您不妨等待其中一位加入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多