После того как мы разобрались, как отправлять поля ввода форм в виде параметров строки запроса в конце адреса URL, модуль Python urllib. request, о котором говорилось в главах 1 и 13, оказывается для нас еще более полезным. Напомню, что этот модуль позволяет получать ответ, сгенерированный для любого адреса URL. Когда адрес URL ссылается на простой файл HTML, мы просто загрузим его содержимое. Но когда адрес ссылается на сценарий CGI, действие будет состоять в запуске удаленного сценария и получении его вывода. Это понятие открывает путь к веб-служ бам, которые генерируют разметку XML в ответ на входные параметры. В простейшем случае это позволяет тес тиро вать удаленные сценарии.
Например, мы можем напрямую запустить сценарий из примера 15.8, без использования веб-страницы tutor3.html или ввода адреса URL в адресную строку броузера:
C:\…\PP4E\Internet\Web> python
>>> from urllib.request import urlopen
>>> reply = urlopen(‘http://localhost/cgi-bin/tutor3.py?user=Brian’).read() >>> reply
b'<TITLE>tutor3.py</TITLE>\n<H1>Greetings</H1>\n<HR>\n<P>Hello, Brian.</P>\ n<HR>\n’
>>> print(reply.decode())
<TITLE>tutor3.py</TITLE>
<H1>Greetings</H1>
<HR>
<P>Hello, Brian.</P>
<HR>
>>> url = ‘http://localhost/cgi-bin/tutor3.py’
>>> conn = urlopen(url)
>>> reply = conn.read()
>>> print(reply.decode())
<TITLE>tutor3.py</TITLE>
<H1>Greetings</H1>
<P>Who are you?</P>
<HR>
В главе 13 рассказывалось, что метод urllib.request.urlopen возвращает объект файла, подключенный к потоку сгенерированного ответа. Операция чтения из этого файла возвращает разметку HTML, которую обычно получают броузеры и отображают ее в виде страницы. В версии 3.X ответ принимается из сокета, в виде строки байтов bytes, но его можно декодировать в строку str, если это необходимо.
Когда подобным способом выполняется непосредственное получение разметки HTML ответа, ее можно проанализировать с помощью инструментов Python обработки текста, включая строковые методы, такие как split и find, модуль re сопоставления с регулярными выражениями или модуль html.parser разбора HTML — все эти инструменты мы будем рассматривать в главе 19. Извлечение текста из ответа, подобное этому, иногда неформально называют чте ни ем с экра на (screen scraping) — способ использования содержимого веб-сайта в других программах. Прием чтения с экрана является альтернативой использованию более сложных фреймворков веб-служб, хотя и ненадежной: незначительные изменения в формате страницы могут нарушать работу программ, опирающихся на этот метод. Наконец, текст ответа можно просто просмотреть — модуль urllib.request позволяет тестировать сценарии CGI из интерактивной оболочки Python или из других сценариев без использования броузера.
В более общем случае эта методика позволяет использовать серверный сценарий как своеобразную функцию. Например, графический интерфейс на стороне клиента может вызывать сценарий CGI и анализировать сгенерированную страницу ответа. Аналогично, сценарий CGI, сохраняющий изменения в базе данных, можно вызывать программно, с помощью модуля urllib.request, без использования страницы с формой ввода. Это также открывает путь к автоматизации регрессионного тестирования сценариев CGI — мы можем вызывать сценарии на любом удаленном компьютере и сравнивать их ответы с ожидаемыми результатами. Мы еще встретимся с модулем urllib.request в последующих примерах.
Прежде чем двинуться дальше, необходимо сделать несколько замечаний, касающихся особенностей использования модуля urllib.request. Во-первых, этот модуль также поддерживает прокси-серверы, альтернативные режимы передачи данных, поддержку защищенного протокола HTTPS на стороне клиента, cookies, перенаправление и многое другое. Например, он может обеспечить прозрачную поддержку прокси-серверов с применением переменных окружения или настроек системы или с помощью объектов ProxyHandler в этом модуле (подробности и примеры их использования смотрите в документации).
Кроме того, хотя это обычно и не имеет значения для сценариев Python, модуль urllib.request предоставляет возможность отправлять параметры методами get и post, описанными выше. По умолчанию используется метод get, и тогда параметры передаются в виде строки запроса в конце адреса URL, как было показано выше. Чтобы использовать метод post, необходимо передать параметры в виде отдельного аргумента:
> >> from urllib.request import urlopen
> >> from urllib.parse import urlencode
> >> params = urlencode({‘user’: ‘Brian’})
>>> params
‘user=Brian’
>>>
> >> print(urlopen(‘http://localhost/cgi-bin/tutor3.py’, params).read(). decode())
<TITLE>tutor3.py</TITLE>
<H1>Greetings</H1>
<HR>
<P>Hello, Brian.</P>
<HR>
Наконец, если ваше веб-приложение опирается на использование cookies на стороне клиента (обсуждаются ниже), их поддержка обеспечивается модулем urllib.request автоматически, с использованием имеющейся поддержки в стандартной библиотеке Python, позволяющей сохранять cookies локально и позднее возвращать их серверу. Также поддерживаются перенаправление, аутентификация и многое другое. Кроме того, поддерживается передача данных по защищенному протоколу HTTP (HTTPS), если ваш компьютер обеспечивает работу с защищенными сокетами (такая поддержка имеется в большинстве систем). Подробности смотрите в руководстве по стандартной библиотеке Python. Поддержку работы с cookies мы будем рассматривать далее в этой главе, а в следующей познакомимся с защищенным протоколом HTTPS.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011