Есть ли альтернатива parse_qs, которая обрабатывает точки с запятой?

Есть ли альтернатива parse_qs, которая обрабатывает точки с запятой?

03.01.2014 10:21:59 Просмотров 49 Источник

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 на данный момент, но хотел бы посмотреть, что еще можно сделать.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/20910273/is-there-an-alternative-to-parse-qs-that-handles-semi-colons#comment31390792_20910273
К сожалению ';' это жестко закодировано в urlparse, чтобы быть разделителем. См.: hg.python.org/cpython/file/2.7/Lib/urlparse.py#l150-157 и нет способа перезаписать его с помощью аргументов.

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

Kyle Kelley

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.

Закрыть X