Есть ли альтернатива parse_qs, которая обрабатывает точки с запятой?
TL; DR
Какие библиотеки / вызовы доступны для обработки строк запроса, содержащих точки с запятой, иначе, чем parse_qs?
>>> urlparse.parse_qs("tagged=python;ruby")
>>> {'tagged': ['python']}
Полный Фон
Я работаю с API StackExchange для поиска помеченных вопросов.
Поиск осуществляется следующим образом, с тегами, разделенными точками с запятой:
/2.1/search?order=desc&sort=activity&tagged=python;ruby&site=stackoverflow
Взаимодействие с API-это просто прекрасно. Проблема возникает, когда я хочу проверить вызовы, особенно при использовании httpretty для макета HTTP.
Под капотом, httpretty
использует urlparse.parse_qs
из стандартных библиотек python для разбора строки запроса.
>>> 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 на данный момент, но хотел бы посмотреть, что еще можно сделать.


Ответы - Есть ли альтернатива parse_qs, которая обрабатывает точки с запятой? / Is there an alternative to parse_qs that handles semi-colons?

04.01.2014 01:37:47
Чтобы обойти это, я временно обезьяна заплатил 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
.