Я обещал, что не стану много рассказывать в этой книге о языке разметки HTML, но для понимания примеров некоторые знания все-таки потребуются. Вкратце, HTML — это описательный язык разметки, основанный на тегах — элементах, заключенных в пару символов <>. Одни теги являются самостоятельными (например, <HR> определяет горизонтальную линию). Другие действуют парно, обозначая начало и конец области действия тега; при этом в концевой тег входит дополнительный символ слэша.
Например, строка заголовка уровня 1 определяется на языке HTML как <H1>text</H1>. Текст text между тегами будет выведен на веб-странице. Некоторые теги позволяют также указывать дополнительные параметры (иногда их называют атрибутами). Например, пара тегов вида <A href="address">text</A> определяет ги пер ссыл ку: если щелкнуть на тексте ссылки на странице, броузер выполнит переход по интернет-адресу (URL), указанному в параметре href.
Важно помнить, что язык разметки HTML используется только для описания страниц: веб-броузер читает код HTML и на основе содержащегося в нем описания строит веб-страницу с заголовками, абзацами, ссылками и тому подобным. Примечательно, что в разметке отсутствует ин форма ция о рас по ло же нии (за размещение компонентов на странице отвечает броузер) и программная логика — в разметке нет операторов if, циклов и так далее. Кроме того, в тексте примера 15.2 отсутствует программный код на языке Python — исходный код HTML предназначен только для описания страниц, а не для составления программ или определения всех деталей интерфейса пользователя.
Отсутствие в HTML элементов управления интерфейсом пользователя и возможности определять логику работы является одновременной сильной и слабой его чертой. Он хорошо приспособлен для описания страниц и простых интерфейсов пользователя на высоком уровне. Броузер, а не вы, занимается физическим размещением компонентов страницы на экране. С другой стороны, HTML непосредственно не поддерживает развитые возможности графических интерфейсов, что вызывает необходимость применения на веб-сайтах CGI-сценариев (или других технологий, таких как полнофункциональные интернет-приложения, RIA) для введения динамической составляющей в статичный по сути HTML.
Интернет-адреса (URL)
После создания файла HTML его необходимо поместить в таком месте, где он будет доступен веб-броузеру. Если вы используете локальный вебсервер на языке Python, как описано выше, это совсем просто: адреса URL вида http://localhost/file.html открывают доступ к веб-страницам, а http://localhost/cgi-bin/file.py — к CGI-сценариям. Такое задание адресов обусловлено тем, что сценарий веб-сервера по умолчанию обслуживает страницы и сценарии, находящиеся в том каталоге, откуда он был запущен.
На других серверах адреса URL могут иметь более сложный вид. Как и все файлы HTML, tutor0.html должен быть записан в каталог на сервере, из которого выполняющаяся программа веб-сервера разрешает броузерам получать страницы. Например, на сервере, использовавшемся в примерах ко второму изданию этой книги, файл страницы должен был храниться внутри или ниже каталога public_html в моем личном домашнем каталоге, то есть где-то в дереве каталогов, растущем из /ho- me/lutz/public_html. Полный путь к этому файлу на сервере Unix будет:
/home/lutz/public_html/tutor0.html
Этот путь отличается от адреса PP4E\Internet\Web в пакете примеров, прилагаемом к книге, указанного в заголовке примера 15.2. Однако при ссылке на этот файл вместо полного пути к файлу в дереве каталогов клиент должен указывать его адрес в Интернете, также называемый URL. Ниже приводится адрес URL, который использовался для загрузки страницы с удаленного сервера:
http://starship.python.net/~lutz/tutor0.html
Удаленные серверы автоматически отображают такие адреса URL в путь к файлу в файловой системе, практически так же, как начальная часть адреса http://localhost отображается в каталог с примерами, содержащий сценарий веб-сервера, действующий на локальном компьютере. Вообще говоря, строки URL, подобные этой, состоят из нескольких частей: Имя протокола: http
Часть этого адреса URL, содержащая протокол, сообщает броузеру, что он должен связаться с программой HTTP-сервера, выполняющейся на компьютере сервера, с помощью протокола сообщений HTTP. В адресах URL, используемых в броузерах, могут указываться различные протоколы. Например, ftp:// — для ссылки на файл, обслуживаемый сервером FTP и действующий по протоколу FTP, file:// — для ссылки на локальный файл, telnet — для начала сеанса Telnet клиента и так далее.
Имя сервера и порт: starship.python.net
Адрес URL также определяют доменное имя или IP-адрес (Internet Protocol — протокол Интернета) целевого сервера. В данном случае это доменное имя сервера, где установлены примеры. Заданное имя используется при открытии сокета для связи с сервером. Как обычно, имя localhost (или эквивалентный ему IP-адрес 127.0.0.1) обозначает веб-сервер, выполняющийся на том же компьютере, что и клиент.
При необходимости данная часть адреса URL может также явно определять номер порта, на котором сервер принимает запросы на соединение, следующий за двоеточием (например, starship.python.net:8000 или 127.0.0.1:80). В случае использования протокола HTTP сокет обычно соединяется с портом номер 80, который используется по умолчанию, если номер порта не указан в адресе. Более подробную информацию об именах и портах можно найти в главе 12.
Путь к файлу: ~lutz/tutor0.html
Наконец, адрес URL определяет путь к нужному файлу на удаленной машине. Веб-сервер HTTP автоматически транслирует путь к файлу из URL в действительный путь к файлу: на моем сервере starship часть адреса ~lutz автоматически транслируется в каталог public_ html в моем домашнем каталоге. При использовании сценария вебсервера на языке Python, представленного в примере 15.1, пути к файлам отображаются в текущий рабочий каталог сервера. Обычно адреса URL отображаются в такие файлы, но могут ссылаться и на элементы других видов и, как будет показано чуть ниже, даже на выполняемые CGI-сценарии, которые автоматически запускаются сервером при обращении к ним.
Пара метры за про са (в бо лее позд них Примерах)
За адресом URL могут также следовать дополнительные входные параметры для программ CGI. Параметры указываются после знака ? и отделяются один от другого символом &. Например, строка в конце URL вида ?name=bob&job=hacker передает CGI-сценарию, указанному в URL, параметры name и job со значениями bob и hacker соответственно. Как будет обсуждаться ниже в этой главе, когда мы будем исследовать правила экранирования, иногда параметры могут отделяться символами ; , как в строке ?name=bob;job=hacker, хотя такая форма встречается значительно реже.
Эти значения иногда называются пара метра ми стро ки за про са URL, они обрабатываются так же, как получаемые сценариями данные формы. Технически параметры запроса могут иметь различную структуру (например, можно передавать неименованные значения, разделяемые символом +), однако в этой книге мы дополнительные возможности рассматривать не будем; подробнее о формах и параметрах рассказывается ниже в этой главе.
Чтобы убедиться, что мы ухватили суть синтаксиса адресов URL, разберем еще один пример, который мы будем использовать ниже в этой главе. Компоненты следующего адреса URL для протокола HTTP:
http://localhost:80/cgi—bin/languages.py?language=All
однозначно идентифицируют сценарий на сервере, как описывается ниже:
• Имя сервера localhost обозначает веб-сервер, выполняющийся на том же компьютере, что и клиент, — как объяснялось выше, именно такую конфигурацию мы будем использовать в наших примерах.
• Номер порта 80 определяет порт сокета, на котором веб- сервер принимает запросы на соединение (порт 80 используется по умолчанию, если номер порта отсутствует в адресе URL, поэтому мы обычно опускаем его).
• Путь к файлу cgi-bin/languages.py определяет местоположение файла, который будет выполняться на сервере, внутри каталога, откуда сервер начинает поиск запрашиваемых файлов.
Несмотря на то, что под представленное описание подпадает большинство реальных адресов URL, тем не менее, полная форма представления адресов URL выглядит так:
protocol://networklocation/path;parameters?querystring#fragment
Например, часть fragment адреса определяет имя раздела внутри страницы (например, #part1). Кроме того, каждая часть адреса может иметь свой собственный формат, а некоторые части поддерживаются не для всех протоколов. Например, часть ;parameters не поддерживается для протокола HTTP (она явно определяет тип файла при использовании протокола FTP), а часть networklocation может также определять необязательные параметры аутентификации пользователя для некоторых протоколов (полный формат представления этой части для протоколов FTP и Telnet имеет вид user:password@host:port, а для протокола HTTP — host:port). Например, в главе 13 мы уже использовали сложные адреса URL для протокола FTP, включающие имя пользователя и пароль, а также определяющие двоичный тип файла (если тип файла не указан, он может быть определен сервером автоматически):
ftp://lutz:password@ftp.rmi.net/filename;type=i
Мы не будем здесь отвлекаться на дополнительные правила форматирования адресов URL. Если вам нужны подробности, можно начать с чтения описания модуля urllib.parse в руководстве по стандартной библиотеке Python, а также просмотреть его программный код в стандартной библиотеке Python. Можно также обратить внимание, что URL, который вводится для доступа к некоторой странице, выглядит несколько иначе после того, как страница получена (пробелы превращаются в символы +, добавляются % и так далее). Это связано с тем, что броузеры, как правило, должны следовать соглашениям по экранированию (то есть трансляции) адресов URL, которые будут изучены далее в этой главе.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011