import urllib.parse urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)
query
- словарь ИЛИ последовательность кортежей из 2-х элементов,doseq=False
- создавать или нет одинаковые ключи для разных значений,safe=''
- символы ASCII, которые не следует кодировать,encoding=None
- исходная кодировка значений,errors=None
- обработчик ошибок кодировки, quote_via=quote_plus
- функция кодирования значений.key=value
, разделенных символами '&'
.Функция urlencode()
модуля urllib.parse
преобразует объект сопоставления (словарь) или последовательность кортежей, состоящих из 2-х элементов в текстовую ASCII строку с процентным кодированием.
Ключи и значения объекта сопоставления, а так же оба элемента кортежа, передаваемые в query
могут иметь тип str
ИЛИ bytes
.
Результирующая строка представляет собой ряд пар key=value
, разделенных символами '&'
, где и ключ key
и значение value
заключаются в кавычки с помощью функции для аргумента quote_via
. Для цитирования значений, по умолчанию используется функция quote_plus()
, это означает, что пробелы заключаются в кавычки, как символ '+'
, а символы '/'
кодируются как %2F
, что соответствует стандарту для запросов GET (application/x-www-form-urlencoded
). Альтернативной функцией, которая может быть передана как quote_via
, является quote()
, которая будет кодировать пробелы как %20
, а символы ‘/’
- кодировать не будет. Для максимального контроля того, что кодируется, используйте аргумент quote
, а так же укажите значение аргумента safe
.
Когда в качестве аргумента query
используется последовательность двухэлементных кортежей, то первый элемент каждого кортежа является ключом, а второй - значением. Элемент value
сам по себе может быть последовательностью, и в этом случае, если необязательный аргумент doseq
принимает значение True
, для каждого элемента последовательности значений ключа генерируются отдельные пары key=value
, разделенные символом '&'
. Порядок параметров в кодированной строке будет соответствовать порядку кортежей параметров в последовательности.
Аргументы safe
, encoding
и errors
передаются в quote_via
(параметры encoding
и errors
передаются только в том случае, если элемент запроса является текстовой строкой str
).
Чтобы наоборот, разобрать строку с элементами POST/GET запроса в структуры данных Python, то нужно воспользоваться функциями этого модуля parse_qs()
и parse_qsl()
.
urllib.parse.urlencode()
:Используем функцию urllib.parse.urlencode()
для генерации строки запроса URL-адреса или данных для POST-запроса.
Вот пример генерации URL-адреса, содержащего параметры для GET/POST запроса:
>>> import urllib.parse >>> query = {'spam': 1, 'eggs': 2, 'bacon': 'foo'} >>> params = urllib.parse.urlencode(query) >>> f'http://example.com/query?{params}' # 'http://example.com/query?spam=1&eggs=2&bacon=foo'
Поведение аргумента doseq
>>> import urllib.parse >>> query = {'spam': 1, 'bacon': ['foo', 'bar']} # doseq=False по умолчанию >>> urllib.parse.urlencode(query) # 'spam=1&bacon=%5B%27foo%27%2C+%27bar%27%5D' # doseq=True >>> urllib.parse.urlencode(query, doseq=True) # 'spam=1&bacon=foo&bacon=bar'
Изменение функции кодирования quote_via
.
>>> import urllib.parse >>> query = {'spam': 1, 'bacon': ['foo', 'bar']} >>> urllib.parse.urlencode(query, quote_via=urllib.parse.quote) # 'spam=1&bacon=%5B%27foo%27%2C%20%27bar%27%5D
Передача списка кортежей, вместо словаря.
>>> import urllib.parse >>> query = [('spam': 1), ('bacon': ['foo', 'bar'])] >>> urllib.parse.urlencode(query, doseq=True) # 'spam=1&bacon=foo&bacon=bar'