【发布时间】:2014-01-21 12:20:00
【问题描述】:
TL;DR
哪些库/调用可用于处理包含与 parse_qs 不同的分号的查询字符串?
>>> urlparse.parse_qs("tagged=python;ruby")
>>> {'tagged': ['python']}
完整背景
我正在使用 StackExchange API 来搜索标记的问题。
Search 的布局是这样的,标签用分号隔开:
/2.1/search?order=desc&sort=activity&tagged=python;ruby&site=stackoverflow
与 API 交互就可以了。当我想测试调用时,问题就出现了,特别是在使用httpretty 模拟 HTTP 时。
在后台,httpretty 使用 python 标准库中的urlparse.parse_qs 来解析查询字符串。
>>> urlparse.parse_qs("tagged=python;ruby")
{'tagged': ['python']}
显然这并不好。这是一个小例子,这里是 httpretty 的 sn-p(在测试上下文之外)。
import requests
import httpretty
httpretty.enable()
httpretty.register_uri(httpretty.GET, "https://api.stackexchange.com/2.1/search", body='{"items":[]}')
resp = requests.get("https://api.stackexchange.com/2.1/search", params={"tagged":"python;ruby"})
httpretty_request = httpretty.last_request()
print(httpretty_request.querystring)
httpretty.disable()
httpretty.reset()
我想使用 httpretty 的机器,但需要解决 parse_qs 的问题。我现在可以修补 httpretty,但很想看看还能做些什么。
【问题讨论】:
-
不幸的是';'它在 urlparse 中被硬编码为分隔符。请参阅:hg.python.org/cpython/file/2.7/Lib/urlparse.py#l150-157 并且无法通过参数覆盖它。
-
哦,嘿,感谢您链接到源代码。看起来它实际上是在
parse_qsl中硬编码的。
标签: python http mocking stackexchange httpretty