python - 是否有处理分号的 parse_qs 的替代方法?

标签 python http mocking stackexchange httpretty

长话短说

哪些库/调用可用于处理包含不同于 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 的一个片段(在测试上下文之外)。

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,但很想看看还能做什么。

最佳答案

为了解决这个问题,我临时修补了 httpretty.core.unquote_utf8(技术上 httpretty.compat.unquote_utf8)。

#
# To get around how parse_qs works (urlparse, under the hood of
# httpretty), we'll leave the semi colon quoted.
# 
# See https://github.com/gabrielfalcao/HTTPretty/issues/134
orig_unquote = httpretty.core.unquote_utf8
httpretty.core.unquote_utf8 = (lambda x: x)

# It should handle tags as a list
httpretty.register_uri(httpretty.GET,
                       "https://api.stackexchange.com/2.1/search",
                       body=param_check_callback({'tagged': 'python;dog'}))
search_questions(since=since, tags=["python", "dog"], site="pets")

...

# Back to normal for the rest
httpretty.core.unquote_utf8 = orig_unquote
# Test the test by making sure this is back to normal
assert httpretty.core.unquote_utf8("%3B") == ";"

这假设您不需要任何其他未引用的内容。另一种选择是在分号到达 parse_qs 之前只对分号进行百分比编码。

关于python - 是否有处理分号的 parse_qs 的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20910273/

相关文章:

python - Django 脆皮表单错误消息

java - 将 HTTP 响应发送/ channel 化回浏览器

c# - System.Net.WebRequest - 超时错误

vue.js test-utils 如何测试挂载生命周期钩子(Hook)中的函数

python - 如何使用mock.patch覆盖Django View 进行测试?

python - Django:奇怪的 TemplateDoesNotExist 错误

python - 爬虫进程意外死亡

python - 复制 pandas 列,根据之前的列给出值

ajax - 浏览器如何使用 WebSocket 处理 DNS 查找和 TLS?

spring - 如何使用 Spring 测试模拟的 JNDI 数据源?