В адресах URL используются иные специальные символы и иные соглашения по их экранированию. По этой причине для экранирования адресов URL применяются другие библиотечные инструменты Python. Модуль Python urllib.parse предоставляет два инструмента, осуществляющие преобразование: функцию quote, возвращающую стандартные шестнадцатеричные экранированные последовательности %XX URL для большинства не алфавитно-цифровых символов, и функцию quote_plus, для преобразования пробелов в символы +. Кроме того, модуль urllib. parse предоставляет функции для обратного преобразования экранированных последовательностей в адресах URL: функция unquote преобразует последовательности %XX, а функция unquote_plus также преобразует символы + в пробелы. Ниже приводится пример использования модуля в интерактивной оболочке:
>>> import urllib.parse
>>> urllib.parse.quote("a & b #! c") ‘a%20%26%20b%20%23%21%20c’
>>> urllib.parse.quote_plus("C:\stuff\spam.txt") ‘C%3A%5Cstuff%5Cspam.txt’
>>> x = urllib.parse.quote_plus("a & b #! c")
>>> x
‘a+%26+b+%23%21+c’
>>> urllib.parse.unquote_plus(x) ‘a & b #! c’
Экранированные последовательности URL помещают шестнадцатеричные значения небезопасных символов вслед за знаком % (обычно это их ASCII-коды). В urllib.parse небезопасными символами обычно считаются все кроме букв, цифр и некоторых безопасных специальных символов (символов ‘_.-‘), но эти два инструмента по-разному интерпретируют символы слэша, а кроме того, имеется возможность расширить набор безопасных символов, передав функции quote дополнительный строковый аргумент:
>>> urllib.parse.quote_plus("uploads/index.txt")
‘uploads%2Findex.txt’
>>> urllib.parse.quote("uploads/index.txt") ‘uploads/index.txt’
>>>
>>> urllib.parse.quote_plus("uploads/index.txt", ‘/’) ‘uploads/index.txt’
>>> urllib.parse.quote("uploads/index.txt", ‘/’)
‘uploads/index.txt’
>>> urllib.parse.quote("uploads/index.txt", »)
‘uploads%2Findex.txt’
>>>
>>> urllib.parse.quote_plus("uploads\index.txt")
‘uploads%5Cindex.txt’
>>> urllib.parse.quote("uploads\index.txt")
‘uploads%5Cindex.txt’
>>> urllib.parse.quote_plus("uploads\index.txt", ‘\\’) ‘uploads\\index.txt’
Обратите внимание, что модуль Python cgi в процессе извлечения входных данных также преобразует экранированные последовательности URL обратно в их исходные символы и меняет знаки + на пробелы. Внутренне конструктор cgi.FieldStorage при необходимости автоматически вызывает инструменты urllib.parse для обратного преобразования параметров, передаваемых в конце адреса URL. В итоге сценарии CGI получают исходные, неэкранированные строки URL, и им не требуется самостоятельно производить обратное преобразование значений. Как мы видели, сценариям CGI вообще не требуется знать, что входные данные поступили из URL.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011